You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Leetcode腐烂橘子问题递归深度超限错误原因咨询

递归深度超限错误原因分析

问题背景

我为LeetCode的《腐烂的橘子》问题写了递归解法,但遇到了Max Recursion Depth Error(最大递归深度错误),就算是grid = [[2,1,1], [1,1,0], [0,1,1]]这种简单输入也会报错,错误出在判断语句行:if ((r,c,time) in seen or r < 0 or c < 0 or r >= R or c >= C or grid[r][c] == 0):。我不需要解题思路,就想搞清楚为啥递归会出这种严重问题。

代码实现

def orangesRotting(grid):
    R,C = len(grid), len(grid[0])
    seen = set()
    min_time = 0
    
    def fresh_search(r,c, time):
        if ((r,c,time) in seen or r < 0 or c < 0 or r >= R or c >= C or grid[r][c] == 0):
            return
        elif grid[r][c] == 2:
            seen.add((r,c,0))
        elif grid[r][c] == 1:
            seen.add((r,c, time + 1))
        
        fresh_search(r+1,c,time+1)
        fresh_search(r-1,c,time+1)
        fresh_search(r,c+1,time+1)
        fresh_search(r,c-1,time+1)      
    
    for i in range(R):
        for j in range(C):
            if grid[i][j] == 2:
                fresh_search(i,j,0)
                
    for _,_,t in list(seen):
        min_time = max(min_time,t)
    
    return min_time

递归深度超限的核心原因

  • 无限递归循环无法终止:你的终止条件依赖(r,c,time)是否在seen中,但每次递归time都会加1,导致同一个坐标(r,c)会带着不同的time值被反复处理。比如从(0,0)递归到(0,1),再从(0,1)递归回(0,0)时,time已经增加了2,(0,0,2)不在之前存入的(0,0,0)里,所以不会触发终止返回,直接陷入无限递归。
  • 多腐烂橘子的递归路径交叉加重问题:每个腐烂橘子都启动一次递归,不同烂橘子的递归路径相互交叉,进一步增加了重复递归的次数,让递归深度迅速超过Python默认的递归深度限制(默认是1000)。
  • 终止条件逻辑存在漏洞:seen集合存储的是(r,c,time)三元组,但同一个坐标的不同time值会被视为不同元素,根本无法有效阻止同一坐标被反复访问,递归没有真正的停止边界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:20:41