我在python中编写以下程序:
def find_graph(graph, start, end, path=[]):
f=0
if start==end:
if start in graph:
return start
if not start in graph:
return None
if not end in graph.values():
return None
path.append(start)
for i in graph[start]:
if end in graph[start]:
path.append(end)
f=1
break
else:
for j in graph[start]:
if f==1:
break
else:
find_graph(graph, j, end, path)
return path
p=find_graph({'A': ['B','C'], 'B': ['C', 'D'], 'C': 'D', 'D': 'E'}, 'A', 'E')
print(p)
它尚未完成,但我只是想知道,当它处于最后一步时,即它确实是path.append('E'),那么它确实f = 1并且中断。然后它转到return path
行;接下来它应返回此值,但它会转到find_graph(graph, j, end, path)
条件中的else
行。为什么会这样?我也放了f
标志,只是为了它不会这样做,但是当return path
f
变为0时,我不知道为什么。请帮忙。
答案 0 :(得分:0)
已经两年了,所以让我们解决这个问题。在函数返回之前,f
标志变量被设置为1,因此测试f == 1
永远不会为真。这似乎也是一个问题:
if not end in graph.values():
return None
作为结束节点'F'
可以在'B': ['C', 'D', 'F'],
中并且没有子节点,但是即使图形有效,上述操作也会失败。该图由于具有两种不同的子结构而变得复杂:
'B': ['C', 'D'], 'C': 'D',
而不是简单地:
'B': ['C', 'D'], 'C': ['D'],
但是我们可以解决这个问题。最后,您找不到的不是图形,也不是图形的路径,而是图形中的所有路径,因此我们需要使用不同的名称,并确保始终返回列表列表(或空列表):< / p>
def find_paths(graph, start, end):
if start not in graph:
return []
if start == end:
return [[start]]
nodes = list(graph[start])
if end in nodes:
return [[start, end]]
paths = []
for node in nodes:
for sub_path in find_paths(graph, node, end):
paths.append([start] + sub_path)
return paths
print(find_paths({'A': ['B', 'C'], 'B': ['C', 'D'], 'C': 'D', 'D': 'E'}, 'A', 'E'))
输出
> python3 test.py
[['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'D', 'E'], ['A', 'C', 'D', 'E']]
>
我们可以看到从'A'到'E'共有3条路径-并且代码比您尝试的要简单。