在Python中使用递归时需要小心一点,因为对递归深度的预设限制非常低,并且如果递归太深,就会出现诸如RuntimeError:cmp中超过最大递归深度的错误。在
当我试图运行你的代码时,我得到一个错误:类型错误:无法连接'str'和'NoneType'对象。这是因为函数只在start==finish时返回一个值,也就是说,在您的示例中,当您再次到达“C”时。因为函数的else部分没有return,所以如果start,它将返回特殊值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