You need to enable JavaScript to run this app. 最大岛屿面积递归解法报栈溢出错误,是否函数调用存在问题
优惠活动
大模型
产品
解决方案
定价
更多

最大岛屿面积递归解法报栈溢出错误,是否函数调用存在问题

最大岛屿面积递归实现栈溢出问题分析与修复

问题根因

代码出现栈溢出的核心原因是无限递归,由以下几个错误共同导致:

  • 没有标记已访问的陆地格子:每次递归到相邻陆地后,没有将当前陆地标记为已访问,递归返回时会被相邻格子的遍历逻辑再次扫描到,形成循环调用,最终占满栈空间。
  • grid参数为值传递:每次调用calcarea都会拷贝一份完整的矩阵,你对grid的所有修改都仅作用于拷贝的副本,原矩阵永远保持初始状态,进一步加剧了无限递归的问题,同时也造成了不必要的性能损耗。
  • ans参数逻辑混乱:全局变量ans和calcarea的形参ans重名,形参为值传递,函数内对ans的修改无法同步到全局变量,面积计算逻辑也完全失效。

修复后的代码

#include <vector>
#include <algorithm>
using namespace std;

int ans;
vector<vector<int>> dir = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};

void calcarea(vector<vector<int>>& grid, int r, int c, int m, int n)
{
    // 标记当前格子已访问
    grid[r][c] = 0;
    for(auto &d : dir)
    {
        int t1 = r + d[0];
        int t2 = c + d[1];
        if(t1 >= 0 && t1 < m && t2 >= 0 && t2 < n && grid[t1][t2] == 1)
        {
            ans += 1;
            calcarea(grid, t1, t2, m, n);
        }
    }
}

int maxAreaOfIsland(vector<vector<int>>& grid) {
    int m = grid.size();
    if(m == 0) return 0;
    int n = grid[0].size();
    int output = 0;
    
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            if(grid[i][j] == 1)
            {
                ans = 1;
                calcarea(grid, i , j, m, n);
                output = max(output, ans);
            }
        }
    }
    return output;
}

关键修改说明

  • 将calcarea的grid参数改为引用传递(加&符号),所有修改直接作用于原矩阵,避免拷贝同时保证访问标记生效。
  • 进入calcarea后首先将当前格子设为0,标记为已访问,彻底避免循环递归。
  • 移除calcarea的形参ans,直接操作全局ans变量,保证面积计数正确。
  • 增加空矩阵判断逻辑,避免边界输入崩溃。

内容的提问来源于stack exchange,提问作者Rajat Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 16:15:03