【问题标题】:Runtime Error in python: "Maximum recursion depth exceeded"python中的运行时错误:“超出最大递归深度”
【发布时间】:2014-05-08 04:12:53
【问题描述】:

我有一个程序可以搜索代表迷宫的 2D 列表,如下所示:

####################################
#S#  ##  ######## # #      #     # #
# #   #             # #        #   #
#   # ##### ## ###### # #######  # #
### # ##    ##      # # #     #### #
#   #    #  #######   #   ###    #E#
####################################

我知道什么是递归错误,但我不知道为什么这段代码会导致它,因为它应该只是导致找到“E”。有谁知道这可能如何产生错误?

def solve(x,y):
    mazeList = loadMaze("sample.maze")    

    if mazeList[y][x] == "E":
        return "YOU'VE SOLVED THE MAZE!"
    elif mazeList[y][x+1] == " ":  #right
        mazeList[y][x+1] = ">"
        solve(x+1,y)
    elif mazeList[y+1][x] == " ":  #down
        mazeList[y+1][x] = "v"
        solve(x,y+1)    
    elif mazeList[y][x-1] == " ":  #left
        mazeList[y][x-1] = "<"
        solve(x-1,y)    
    elif mazeList[y-1][x] == " ":  #up
        mazeList[y-1][x] = "^"
        solve(x,y-1)    

【问题讨论】:

  • 你意识到以下类型的迷宫会给你一个无限循环的权利:####### # # #S # # # # # ##### E# #### ###

标签: python recursion


【解决方案1】:

你重新加载mazeList每次调用函数

所以在solve() 开始时,你又回到了起始条件,你最终会在圈子里跑。

使用关键字参数将mazeList 传递给递归调用,默认为None,并且仅在仍为None 时才加载迷宫:

def solve(x, y, mazeList=None):
    if mazeList is None:
        mazeList = loadMaze("sample.maze")

并将mazeList 传递给递归调用。

下一个问题是你永远不会返回递归调用;当您从 solve() 中调用 solve() 时,您仍然需要返回其结果:

def solve(x, y, mazeList=None):
    if mazeList is None:
        mazeList = loadMaze("sample.maze")

    if mazeList[y][x] == "E":
        return "YOU'VE SOLVED THE MAZE!"
    elif mazeList[y][x+1] == " ":  #right
        mazeList[y][x+1] = ">"
        return solve(x+1,y,mazeList)
    elif mazeList[y+1][x] == " ":  #down
        mazeList[y+1][x] = "v"
        return solve(x,y+1,mazeList)    
    elif mazeList[y][x-1] == " ":  #left
        mazeList[y][x-1] = "<"
        return solve(x-1,y,mazeList)    
    elif mazeList[y-1][x] == " ":  #up
        mazeList[y-1][x] = "^"
        return solve(x,y-1,mazeList)    

你仍然会用这种技术把自己画在一个角落里;要递归解决迷宫,您需要尝试所有路径,而不仅仅是一条路径,并为每个递归调用提供一个迷宫的副本,并仅标出一条选择的路径。

您也总是测试 next 单元格,但永远不要考虑下一个单元格可能是目标;你永远不会移动E,因为那个单元格不等于' ',所以它不是移动候选。

以下版本可以解决你的迷宫:

directions = (
    (1, 0, '>'),
    (0, 1, 'v'),
    (-1, 0, '<'),
    (0, -1, '^'),
)

def solve(x, y, mazeList=None):
    if mazeList is None:
        mazeList = loadMaze("sample.maze")

    for dx, dy, char in directions:
        nx, ny = x + dx, y + dy

        if mazeList[ny][nx] == "E":
            return "YOU'VE SOLVED THE MAZE!"

        if mazeList[ny][nx] == " ":
            new_maze = [m[:] for m in mazeList]
            new_maze[ny][nx] = char
            result = solve(nx, ny, new_maze)
            if result is not None:
                return result

分别对每个方向进行测试变得乏味,因此我将其替换为在一系列方向上的循环;每个元组都是 x、y 的变化以及朝那个方向移动时要使用的字符。

演示,打印出已解决的迷宫:

>>> def loadMaze(ignored):
...     maze = '''\
... ####################################
... #S#  ##  ######## # #      #     # #
... # #   #             # #        #   #
... #   # ##### ## ###### # #######  # #
... ### # ##    ##      # # #     #### #
... #   #    #  #######   #   ###    #E#
... ####################################
... '''
...     return [list(m) for m in maze.splitlines()]
... 
>>> directions = (
...     (1, 0, '>'),
...     (0, 1, 'v'),
...     (-1, 0, '<'),
...     (0, -1, '^'),
... )
>>> 
>>> def solve(x, y, mazeList=None):
...     if mazeList is None:
...         mazeList = loadMaze("sample.maze")   
...     for dx, dy, char in directions:
...         nx, ny = x + dx, y + dy
...         if mazeList[ny][nx] == "E":
...             print '\n'.join([''.join(m) for m in mazeList])
...             return "YOU'VE SOLVED THE MAZE!"
...         if mazeList[ny][nx] == " ":
...             new_maze = [m[:] for m in mazeList]
...             new_maze[ny][nx] = char
...             result = solve(nx, ny, new_maze)
...             if result is not None:
...                 return result
... 
>>> solve(1, 1)
####################################
#S#  ##  ######## # #^>>>>>#  ^>># #
#v#^>>#    ^>>>     #^#   v>>>>#v>>#
#v>>#v#####^##v######^# #######  #v#
### #v##^>>>##v>>>>>#^# #     ####v#
#   #v>>>#  #######v>>#   ###    #E#
####################################
"YOU'VE SOLVED THE MAZE!"

【讨论】:

    猜你喜欢
    • 2017-10-25
    • 2021-12-11
    • 2017-08-24
    • 1970-01-01
    • 2016-12-10
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多