提升Python递归限制后程序崩溃,回溯法解迷宫问题排查
问题分析与解决方案
为什么移除那段代码后程序能正常运行?
你遇到的崩溃问题,核心原因是那段代码被错误地放在了solve_maze函数内部,直接触发了无限递归:
当你把这段代码写在函数体末尾时:
if solve_maze(x, y): for i in solution: print(i) else: print('no solution')
每次调用solve_maze(x,y),在完成回溯逻辑(无论是找到终点返回True,还是走不通回溯返回False)后,都会再次调用自身solve_maze(x,y),形成了一个没有终止条件的递归死循环。哪怕你提升了sys.setrecursionlimit(10000),递归深度最终还是会超出Python的栈容量,导致解释器直接崩溃。
而移除这段代码后,函数只会在回溯过程中进行必要的递归调用,不会触发无限循环,自然就能正常运行了。
正确的解决办法
你需要把这段调用代码移到函数定义的外部,作为程序的入口逻辑,同时还要明确迷宫的起始坐标(你的迷宫里起点是*的位置)。
完整修正后的代码示例
import sys sys.setrecursionlimit(10000) # 定义迷宫 maze = [['#'] * 10, ['#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'], ['#', ' ', '#', ' ', '#', ' ', '#', ' ', ' ', '#'], ['#', ' ', '#', ' ', '#', '#', '#', ' ', '#', '#'], ['#', ' ', '#', '#', '#', '*', '#', ' ', ' ', '#'], ['#', ' ', '#', ' ', ' ', ' ', '#', '#', ' ', '#'], ['#', ' ', '#', ' ', '#', '#', '#', '#', ' ', '#'], ['G', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', '#'], ['#'] * 10] # 获取迷宫尺寸 length = len(maze) width = len(maze[0]) # 初始化路径标记矩阵 solution = [[0 for _ in range(width)] for _ in range(length)] def solve_maze(x,y): # 到达终点,标记路径并返回成功 if maze[x][y] == 'G': solution[x][y] = 1 return True # 检查当前位置是否合法:在边界内、未被标记、不是墙(包含起点*) if x >= 0 and y >= 0 and x < length and y < width and solution[x][y] == 0 and maze[x][y] in (' ', '*'): solution[x][y] = 1 # 尝试四个方向的路径 if solve_maze(x+1, y): return True if solve_maze(x, y+1): return True if solve_maze(x-1, y): return True if solve_maze(x, y-1): return True # 回溯:当前路径走不通,取消标记 solution[x][y] = 0 return False # 当前位置不合法,返回失败 return False # 自动找到起点(*的位置) start_x, start_y = None, None for i in range(length): for j in range(width): if maze[i][j] == '*': start_x, start_y = i, j break if start_x is not None: break # 调用求解函数并输出结果 if solve_maze(start_x, start_y): print("找到可行路径:") for row in solution: print(row) else: print("没有可行路径")
额外优化说明
- 自动识别起点:避免手动指定坐标出错,通过遍历找到
*的位置更可靠。 - 合法位置兼容起点:把判断条件从
maze[x][y] == ' '改成maze[x][y] in (' ', '*'),确保起点能被正常访问。 - 明确边界检查:确保
x和y始终在迷宫范围内,避免索引越界错误。
这样修改后,程序就能正常执行回溯逻辑,不会再出现无限递归或崩溃的问题。
内容的提问来源于stack exchange,提问作者Mansour Zayer
相关产品推荐
相关产品推荐

