python中的运行时错误:";超过最大递归深度;
我有一个程序可以搜索二维列表,它代表一个迷宫,如下所示:python中的运行时错误:";超过最大递归深度;,python,recursion,Python,Recursion,我有一个程序可以搜索二维列表,它代表一个迷宫,如下所示: #################################### #S# ## ######## # # # # # # # # # # # # # # ##### ## ###### # ####### # # ### # ## ## # # # #### # # # # ####### # ### #E#
####################################
#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)
def solve(x,y):
mazeList=loadMaze(“sample.maze”)
如果mazeList[y][x]=“E”:
return“你已经解决了迷宫!”
elif mazeList[y][x+1]==“”:#右
mazeList[y][x+1]=“>”
求解(x+1,y)
elif mazeList[y+1][x]==“”:#向下
mazeList[y+1][x]=“v”
求解(x,y+1)
elif mazeList[y][x-1]==“”:#左
mazeList[y][x-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)
对每个方向分别进行测试变得单调乏味,所以我用一系列方向上的循环来代替;每个元组都是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!"
def loadMaze(忽略):
…迷宫=''\
... ####################################
…#S###############
... # # # # # # #
... # # ##### ## ###### # ####### # #
... ### # ## ## # # # #### #
…###############E#
... ####################################
... '''
…返回[在maze.splitlines()中为m列出(m)]
...
>>>方向=(
... (1, 0, '>'),
…(0,1,'v'),
…(-1,0,)您意识到以下类型的迷宫为您提供了一个无限循环,对吗#######
>>> 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!"