增加python递归限制后,似乎程序崩溃了。为什么呢?

时间:2018-05-29 21:30:20

标签: python python-3.x recursion maze

我一直在尝试使用回溯来解决迷宫问题。该代码使用多个递归:

def solve_maze(x,y):    
        if maze[x][y] == 'G': #checking if we've reached the target
            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] == ' ':
            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

我第一次执行程序时,出现“超出递归限制”错误。为了解决这个问题,我增加了限制:

sys.setrecursionlimit(10000)

现在我运行程序,Python崩溃了。怎么了?我该怎么解决这个问题?迷宫不是很大。它的尺寸是10 * 9:

maze = [['#'] * 10,
        ['#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'],
        ['#', ' ', '#', ' ', '#', ' ', '#', ' ', ' ', '#'],
        ['#', ' ', '#', ' ', '#', '#', '#', ' ', '#', '#'],
        ['#', ' ', '#', '#', '#', '*', '#', ' ', ' ', '#'],
        ['#', ' ', '#', ' ', ' ', ' ', '#', '#', ' ', '#'],
        ['#', ' ', '#', ' ', '#', '#', '#', '#', ' ', '#'],
        ['G', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', '#'],
        ['#'] * 10]

*这是稍后添加的:在solve_maze定义的末尾有这段代码:

if solve_maze(x, y):
        for i in solution:
            print(i)
    else:
        print('no solution')

我注意到删除它,该程序工作正常。仍然没有线索为什么

3 个答案:

答案 0 :(得分:1)

填写代码中缺少的部分,似乎有效:

from pprint import pprint

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':  # checking if we've reached the target
        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


solve_maze(4, 5)
pprint(solution)

我在solve_maze中更改的唯一内容是将maze[x][y] == ' '更改为maze[x][y] in ' *',以便起始位置不会破坏它。

输出:

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 1, 0, 0, 0, 0, 0, 1, 1, 0],
 [0, 1, 0, 0, 0, 0, 0, 1, 0, 0],
 [0, 1, 0, 0, 0, 1, 0, 1, 1, 0],
 [0, 1, 0, 1, 1, 1, 0, 0, 1, 0],
 [0, 1, 0, 1, 0, 0, 0, 0, 1, 0],
 [1, 1, 0, 1, 1, 1, 1, 1, 1, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

如果您想知道代码有什么问题,则需要提供MCVE

答案 1 :(得分:0)

我收集的信息如下:

  1. 问题是由于堆栈溢出造成的。
  2. 不建议编辑此限制。
  3. 默认的递归深度限制相当大,如果程序超出限制,则表示代码有一些错误。
  4. if solve_maze(x, y):定义主体中的solve_maze语句是无限递归的原因。
  5. 总而言之,我发现问题是由于一个导致无限递归的错误,程序工作正常,无需增加递归深度限制。

答案 2 :(得分:0)

递归深度比解决迷宫问题所需的深度更深。

最大递归深度不得远远超过直到退出&#34;的路径的&#34; 长度。您的路径的长度为33 (=在到达出口之前,要在10 * 9个瓷砖地图中完成的步骤)。

如果迷宫会有更多的分支,那么递归深度也会增加。但是,递归深度超过1000s 听起来似乎不合理。

这有一个原因:您允许继续搜索相反方向(所以搜索来自哪里)。这不是找到最短路径所必需的,如果你避免它,它会大大减少你的递归深度。