这是我现在的代码:
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
之后返回路径,然后转到下一个路径。
答案 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