我做了一个有效的递归函数,通常是人们想要的东西:)
但是,当它通过"树"选项,我想知道它为什么不打印None分支。
图表:
g = {
"a" : ['c'],
"b" : ['c'],
"c" : ['a', 'b', 'e', 'd'],
'd' : ['c'],
'e' : ['c', 'b', 'g'],
'f' : ['g'],
'g' : ['f'],
}
功能:
def find_path(self, start_vertex, end_vertex, path=[]):
graph = self.__graph_dict
path.append(start_vertex)
if end_vertex == start_vertex:
return path
for neighbour in graph[start_vertex]:
if neighbour not in path:
extended_path = self.find_path(neighbour, end_vertex, path)
if extended_path:
return extended_path
return None
我不理解的情况是当邻居在路径中时它返回None。
print(self.find_path(a,f))
>> ['a', 'c', 'b', 'e', 'g', 'f']
答案 0 :(得分:0)
所以,正如我从评论中理解你的问题那样:“为什么不打印错误的路径?”。答案是他们被淘汰了。
例如,看到它的第一条路径是潜在循环a-c-a-c-a-c
,但由于短路,它永远不会完全迭代:
if neighbour not in path: # prevents loops
如果您将通行证从a
移至c
,您会看到死胡同将返回None
。在找到正确的道路之前,你目前没有死胡同。
至于你的代码,我相信你想为每个递归框架创建一个新的列表,因为列表是可变的,你可能会通过两个独立的框架来改变path
列表导致不一致:
graph = self.__graph_dict
# path.append(start_vertex) # this was wrong
path = path += [start_vertex]
这样就为每个选项生成了一个新列表。你在答案中解决了:
['a', 'c', 'b', 'e', 'g', 'f']
实际上是错的,应该是:
['a', 'c', 'e', 'g', 'f']
答案 1 :(得分:0)
它永远不会到达return None
。
我不明白的是,只有在正确的条件下,它才会继续通过树。
在a
和b
,循环继续循环,直到它定义extended_path
。如果没有这样的路径,那么它将返回None
。