递归图遍历:如何生成并返回所有路径?

时间:2013-10-23 01:37:11

标签: python recursion graph-theory

这是我现在的代码:

  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然后工作,它退出函数,因为返回意味着要做。我想知道如何在这里改进我​​的代码以使其工作并找出我的逻辑错误的原因。例如,我知道它会生成说[DC],但我对如何绕过它感到困惑。也许索引返回的值?然而,这也不起作用!我很困惑如何在CDC之后返回路径,然后转到下一个路径。

1 个答案:

答案 0 :(得分:0)

在Python中使用递归时需要小心,因为递归深度的预设限制非常低,并且您将开始收到错误,如 RuntimeError:cmp中超出最大递归深度如果你太过深入。

当我尝试运行代码时,出现错误: TypeError:无法连接'str'和'NoneType'对象。这是因为该函数仅在 start == finish 时返回一个值,即在您的示例中再次获得“C”时。由于函数的 else 部分中没有 return ,因此如果start!= end,则返回特殊值 None 。 Python不允许您将 None 添加到字符串中,这解释了错误。

下面的代码执行我认为您尝试执行的操作,它会返回从 startNode endNode 的所有路径的列表。我在这里将图形作为输入参数,并返回路径列表。它需要另外两个参数 allPaths pathSoFar ,以跟踪所有路径的列表和当前路径。这仅作为如何使用递归来实现此目的的示例。这段代码有几个问题:

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