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
相关产品推荐
相关产品推荐

