【问题标题】:Why a recursive code does not print the None branches?为什么递归代码不打印 None 分支?
【发布时间】:2015-06-30 18:30:28
【问题描述】:

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

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

我不明白的情况是邻居在路径中并且它返回无。

print(self.find_path(a,f))
>> ['a', 'c', 'b', 'e', 'g', 'f']

【问题讨论】:

  • 什么是None 分支?
  • @recursive 在这种情况下,无分支将是“a”不符合“f”的路径。例如:如果我从 'a' 到 'c' 到 'd' 我不会到达 'f' (你不能倒退)。我称它为“分支”,因为它通过那条路径。不知道有没有更好的解释方式。 “无效”分支会更合适吗?
  • 为什么会打印错误的解决方案?
  • @ReutSharabani 为什么不呢?
  • 我认为你的例子有点不对劲。要么'b'应该有一个e而不是a c,在路径中的b之后添加一个c,或者将'b'留在路径之外。现在它从 b 到 e 并且该路径不存在

标签: python recursion tree


【解决方案1】:

所以,我从 cmets 了解到您的问题是:“为什么没有打印错误的路径?”。答案是他们被淘汰了。

例如,查看的第一条路径是潜在循环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']

【讨论】:

  • 是的,感谢“你可能正在改变列表”
【解决方案2】:

它永远不会到达return None

我不明白的是,只有在意味着正确的条件时,它才会继续遍历树。

ab 处,循环继续循环,直到它定义了extended_path。如果没有这样的路径,只有这样,它才会返回None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2013-09-23
    • 2014-11-23
    • 2020-02-16
    • 2021-12-30
    相关资源
    最近更新 更多