![](/img/trans.png)
[英]Runtime Error: Maximum Recursion Depth Exceeded when Using exit(0) in python
[英]Runtime Error in python: “Maximum recursion depth exceeded”
我有一個程序可以搜索代表迷宮的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)
每次調用該函數時, mazeList
重新加載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)
您仍然可以使用這種技術將自己塗在角落。 要遞歸地解決迷宮問題,您需要嘗試所有路徑,而不僅僅是嘗試一條路徑,並給每個遞歸調用一個迷宮副本 ,其中僅標出一個選定的路徑。
您還總是測試下一個單元格,但是永遠不要考慮下一個單元格可能是目標。 您永遠不會移動到 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!"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.