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

提升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("没有可行路径")

额外优化说明

  1. 自动识别起点:避免手动指定坐标出错,通过遍历找到*的位置更可靠。
  2. 合法位置兼容起点:把判断条件从maze[x][y] == ' '改成maze[x][y] in (' ', '*'),确保起点能被正常访问。
  3. 明确边界检查:确保x和y始终在迷宫范围内,避免索引越界错误。

这样修改后,程序就能正常执行回溯逻辑,不会再出现无限递归或崩溃的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:05:35