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

Python扫雷递归dig函数疑问:遇数值单元格为何未退出?

扫雷游戏dig递归函数执行异常问题分析

核心原因:递归层级的上下文混淆

你看到的self.dig(r,c)继续执行,并不是来自(4,5)这个单元格的函数实例,而是上一层递归调用的循环逻辑在运行:

  • 当(4,5)触发elif self.board[row][col] > 0: return True时,只是退出当前这个dig函数实例,程序会回到调用它的上层函数(比如起始点(6,3)或者它周边的空白单元格的dig函数)中,继续执行遍历周边单元格的循环,发起下一个dig调用。
  • 这种情况是递归的正常行为,每个dig实例的return只会终止自身,不会中断上层函数的循环流程。

调试显示的误导

很多调试器在函数return后,不会立刻切换栈帧显示,可能暂时停留在(4,5)的函数上下文,但实际执行的是上层递归的代码。你可以查看调试器的调用栈面板,确认当前执行的是哪一层的dig函数——如果栈顶是上一层的调用,那就是正常的上层循环继续执行。

结合代码逻辑验证

原dig函数的核心结构大致如下:

def dig(self, row, col):
    if self.dug[row][col] or self.board[row][col] == -1:
        return False
    self.dug[row][col] = True
    if self.board[row][col] > 0:
        return True  # (4,5)执行到这里,退出当前函数实例
    # 遍历周边8个单元格的循环,仅当当前单元格是空白(值为0)时才会进入
    for r in range(max(0, row-1), min(self.rows, row+2)):
        for c in range(max(0, col-1), min(self.cols, col+2)):
            if r != row or c != col:
                self.dig(r, c)  # 上层函数的循环会继续调用这个
    return True

注意:只有当当前单元格的值为0时,才会进入遍历周边的循环。(4,5)的值为1,不会进入自身的循环,它的return只是终止自己,而上层调用它的函数(比如某个空白单元格的dig)还在循环中,所以会继续执行下一个self.dig(r,c)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:27:51