簡體   English   中英

遞歸圖遍歷:如何生成和返回所有路徑?

[英]Recursive graph traversal: how to generate and return all paths?

現在是我的代碼:

  hasht= {"A":["B", "D", "E"], "B":["C"], "C":["D", "E"], "D":["C", "E"], "E":["B"]}
   paths=[]
   def recusive(start, finish, val):
      if start==finish and val!=1:
        return start
    else:
        for i in hasht[start]:
            path= start+ recusive(i,finish,2)
            paths.append(path)
print (recusive("C","C",1))
print paths

所需輸出: [CDC, CDEBC, CEBC]

我正在嘗試生成一個類似於上面的表,但是我遇到了一個問題,即字符串和數組未連接在一起。 當我剛返回時,它返回CDC並可以工作,並且由於return的目的而退出了函數。 我想知道如何在這里改善代碼以使其正常工作,並弄清楚為什么我的邏輯有問題。 例如,我知道它生成說[DC] ,但是我對如何解決這個問題感到困惑。 也許索引返回的值? 但這也不起作用! 我只是對如何使路徑返回為CDC之后感到困惑,然后繼續進行下一個。

在Python中使用遞歸時,您需要格外小心,因為遞歸深度的預設限制非常低,並且您將開始遇到類似RuntimeError的錯誤如果遞歸得太深,將超出cmp中的最大遞歸深度

當我嘗試運行您的代碼時,出現錯誤: TypeError:無法連接'str'和'NoneType'對象 這是因為在示例中,該函數僅在start == finish時才返回值,即,當您再次到達“ C”時。 因為該函數的else部分沒有返回 ,所以如果start!= end,它將返回特殊值None Python不允許您將None添加到字符串,這說明了錯誤。

下面的代碼完成了我認為您想要做的事情,即返回從startNodeendNode的所有路徑的列表。 我在這里將圖作為輸入參數,並返回路徑列表。 它需要2個附加參數allPathspathSoFar ,以跟蹤所有路徑的列表以及當前路徑。 這僅是作為如何使用遞歸來實現此目的的示例。 此代碼有幾處錯誤:

1)它使用了遞歸,正如我之前所說,除非增加預設限制,否則在Python中並不是一個好主意。

2)不能正確處理循環。 如果圖中有循環,則此功能將繼續進行直到達到遞歸限制。 嘗試以A作為起點和終點運行它以查看此情況。

    def generatePaths(theGraph, startNode, endNode, allPaths, pathSoFar=""):
        """
        Recursive function. Finds all paths through the specified
        graph from start node to end node. For cyclical paths, this stops
        at the end of the first cycle.
        """
        pathSoFar = pathSoFar + startNode

        for node in theGraph[startNode]:

            if node == endNode:
                allPaths.append(pathSoFar + node)
            else:
                generatePaths(theGraph, node, endNode, allPaths, pathSoFar)




    graph = {"A":["B", "D", "E"], "B":["C"], "C":["D", "E"], "D":["C", "E"], "E":["B"]}
    paths = []
    generatePaths(graph, "C", "C", paths)
    print paths

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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