簡體   English   中英

最大遞歸深度誤差

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM