堆栈流/附加如何在递归调用中工作(图搜索)

时间:2015-07-02 14:32:03

标签: python recursion graph

这是我试图了解递归,图表在这里作为支持,以帮助我提出我的问题。

我有这张图:

enter image description here

我正在使用此函数查找从一个顶点到另一个顶点的所有可能路径。

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

ad

[['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如何获取附加到它的所有路径? 例如,abc作为邻居。假设它首先通过b path = [a,b],然后再次使用(b,d,[a,b])作为参数调用该函数。它会再次到达d == d的基本情况。

此时,它会返回[a,b,d]等等,直到......什么?堆栈是空的,这是如何工作的?

显然,这是我没有得到的部分,因为paths返回到顶部,为什么所有其他path都可以附加到它上面?

这是我试图理解这个堆叠附加过程:

enter image description here

我认为我的困惑与流程有关(“计算过程如何运作?”)。起初,我认为它是作为paths中第一个元素附加的最长路径,意味着该过程不会在找到最长路径之前结束,但事实并非如此,因为[a,b,d ]是第一个。

0 个答案:

没有答案