这是我试图了解递归,图表在这里作为支持,以帮助我提出我的问题。
我有这张图:
我正在使用此函数查找从一个顶点到另一个顶点的所有可能路径。
def find_all_path(self, start_vertex, end_vertex, path=[]):
graph = self.__graph_dict
path = path + [start_vertex]
if end_vertex == start_vertex:
return [path]
paths = []
for neighbour in graph[start_vertex]:
if neighbour not in path:
extended_paths = self.find_all_path(neighbour, end_vertex, path)
for p in extended_paths:
paths.append(p)
return paths
从a
到d
:
[['a', 'b', 'd'], ['a', 'b', 'c', 'e', 'd'], ['a', 'b', 'c', 'e', 'f', 'd'], ['a', 'c', 'b', 'd'], ['a', 'c', 'e', 'd'], ['a', 'c', 'e', 'f', 'd']]
1。 paths
是通过引用传递的吗?
这意味着,paths
正在每个堆栈中发生变化,即使它们不相关。
2。 paths
如何获取附加到它的所有路径?
例如,a
有b
和c
作为邻居。假设它首先通过b
path = [a,b]
,然后再次使用(b,d,[a,b])
作为参数调用该函数。它会再次到达d == d
的基本情况。
此时,它会返回[a,b,d]
等等,直到......什么?堆栈是空的,这是如何工作的?
显然,这是我没有得到的部分,因为paths
返回到顶部,为什么所有其他path
都可以附加到它上面?
这是我试图理解这个堆叠附加过程:
我认为我的困惑与流程有关(“计算过程如何运作?”)。起初,我认为它是作为paths
中第一个元素附加的最长路径,意味着该过程不会在找到最长路径之前结束,但事实并非如此,因为[a,b,d ]是第一个。