为什么递归代码不打印None分支?

时间:2015-06-30 18:30:28

标签: python recursion tree

我做了一个有效的递归函数,通常是人们想要的东西:)

但是,当它通过"树"选项,我想知道它为什么不打印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']

2 个答案:

答案 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

我不明白的是,只有在正确的条件下,它才会继续通过树。

ab,循环继续循环,直到它定义extended_path。如果没有这样的路径,那么它将返回None