[英]Maximum recursion depth error
我一直在搜尋互聯網,卻找不到任何有幫助的東西。 我正在python中運行基本的dfs算法。 我的錯誤是在explore
的子程序dfs
def dfs(graph):
for node in graph:
if not node in visited:
explore(graph, node)
def explore(graph, v):
visited.append(v)
adjNode = graph[v]
for i in range(0, len(adjNode)):
if not adjNode[i] in visited:
explore(graph, adjNode[i])
visited
是我用來跟蹤已訪問節點的列表,而graph
是保存該圖的字典。 使用1000的標准遞歸限制時,出現此錯誤
File "2breakDistance.py", line 45, in explore
explore(graph, adjNode[i], cycles)
File "2breakDistance.py", line 45, in explore
explore(graph, adjNode[i], cycles)
File "2breakDistance.py", line 45, in explore
explore(graph, adjNode[i], cycles)
File "2breakDistance.py", line 45, in explore
explore(graph, adjNode[i], cycles)
File "2breakDistance.py", line 41, in explore
adjNode = graph[v]
RuntimeError: maximum recursion depth exceeded in cmp
首先,我不明白為什么在錯誤中出現adjNode = graph[v]
因為explore
是遞歸調用和adjNode
只是列表賦值。
但是要處理遞歸錯誤,我用sys.setrecursionlimit(5000)
增加了遞歸限制,但我不再收到該錯誤,但是程序在adjNode = graph[v]
行之前退出並沒有錯誤退出。 它甚至都沒有達到dfs
的末尾,所以我不太確定發生了什么。 感謝您閱讀所有內容和任何幫助!
Python不太擅長遞歸。 它不執行任何尾調用優化,並且除非您手動更改遞歸限制,否則很快就會用完幀空間。 再次查找和調用函數也比將代碼保持在循環中而不遞歸要慢。
嘗試重寫它而不遞歸。 可發生錯誤的任何地方一個新的幀創建的,不只是在您的遞歸調用,這就是為什么錯誤發生的事情。
def explore(graph, v):
visited.append(v)
adjNode = graph[v]
for i in range(0, len(adjNode)):
if not adjNode[i] in visited:
explore(graph, adjNode[i])
這對我來說沒有意義,節點對象中有什么? 為什么要將adjNode分配回傳入的節點的值。adjNode是否要像“ GetConnections()”函數那樣調用?
當前的邏輯感覺應該是這樣的:
1. For each Node in Nodes:
2. Add Node to visited
Get Nodes Connections
Explore SubNodes:
Go to 2.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.