我正在尝试创建一个函数,返回一个地方到另一个地方的所有可能性。
这不是我的最终代码,我不确定它是否有效,但是我阻止了我的错误继续。
以下是我的python 2.7代码:
def routes(graph,start,end):
path=[]
paths=[]
for node in graph[start]:
if node==end:
path+=[end]
elif node<end:
path.append(node)
start=node
routes(graph,start,end)
return paths
graph={001:(002),002:(003,004,005),003:(004),004:(005,006)}
routes(graph,002,005)
进入第二个函数调用时启动的问题。 当它试图在图形[开始]行中运行'for node'时,我得到'int'对象不可迭代'错误。
导致该错误的原因是什么?
为什么在递归之外它起作用而在里面却没有?
非常感谢。
答案 0 :(得分:1)
从here被盗(可能读得很好)并略有更新:
def find_all_paths(graph, start, end, path=[]):
path = path + [start]
if start == end:
return [path]
if start not in graph:
return []
paths = []
for node in graph[start]:
if node not in path:
newpaths = find_all_paths(graph, node, end, path)
for newpath in newpaths:
paths.append(newpath)
return paths
然后这应该给出所需的结果:
graph = {1: (2, ), 2: (3, 4, 5), 3: (4, ), 4: (5, 6)}
print(find_all_paths(graph=graph, start=2, end=5))
# -> [[2, 3, 4, 5], [2, 4, 5], [2, 5]]
或许可以将其与您的版本进行比较并找出出错的地方?
答案 1 :(得分:0)
仍然不起作用
基本上,您只是错过了将找到的路径分配给paths
并在return
之前插入起始节点。更正的版本:
def routes(graph,start,end):
paths=[]
for node in graph[start]:
if node==end:
paths+=[[end]]
elif node<end:
paths+=routes(graph,node,end)
for path in paths:
path.insert(0, start)
return paths
graph={001:(002,),002:(003,004,005),003:(004,),004:(005,006)}
print routes(graph,002,005)
输出:
[[2, 3, 4, 5], [2, 4, 5], [2, 5]]