最大岛屿面积递归解法报栈溢出错误,是否函数调用存在问题
最大岛屿面积递归实现栈溢出问题分析与修复
问题根因
代码出现栈溢出的核心原因是无限递归,由以下几个错误共同导致:
- 没有标记已访问的陆地格子:每次递归到相邻陆地后,没有将当前陆地标记为已访问,递归返回时会被相邻格子的遍历逻辑再次扫描到,形成循环调用,最终占满栈空间。
- 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
相关产品推荐
相关产品推荐

