Python递归表现得很奇怪

时间:2016-10-17 17:18:42

标签: python recursion

我在python中编写以下程序:

def find_graph(graph, start, end, path=[]):
    f=0
    if start==end:
        if start in graph:
            return start
    if not start in graph:
        return None
    if not end in graph.values():
        return None
    path.append(start)
    for i in graph[start]:
        if end in graph[start]:
            path.append(end)
            f=1
            break

        else:
            for j in graph[start]:
                if f==1:
                    break
                else:
                    find_graph(graph, j, end, path)


    return path

p=find_graph({'A': ['B','C'], 'B': ['C', 'D'], 'C': 'D', 'D': 'E'}, 'A', 'E')
print(p)

它尚未完成,但我只是想知道,当它处于最后一步时,即它确实是path.append('E'),那么它确实f = 1并且中断。然后它转到return path行;接下来它应返回此值,但它会转到find_graph(graph, j, end, path)条件中的else行。为什么会这样?我也放了f标志,只是为了它不会这样做,但是当return path f变为0时,我不知道为什么。请帮忙。

1 个答案:

答案 0 :(得分:0)

已经两年了,所以让我们解决这个问题。在函数返回之前,f标志变量被设置为1,因此测试f == 1永远不会为真。这似乎也是一个问题:

if not end in graph.values():
    return None

作为结束节点'F'可以在'B': ['C', 'D', 'F'],中并且没有子节点,但是即使图形有效,上述操作也会失败。该图由于具有两种不同的子结构而变得复杂:

'B': ['C', 'D'], 'C': 'D',

而不是简单地:

'B': ['C', 'D'], 'C': ['D'],

但是我们可以解决这个问题。最后,您找不到的不是图形,也不是图形的路径,而是图形中的所有路径,因此我们需要使用不同的名称,并确保始终返回列表列表(或空列表):< / p>

def find_paths(graph, start, end):

    if start not in graph:
        return []

    if start == end:
        return [[start]]

    nodes = list(graph[start])

    if end in nodes:
        return [[start, end]]

    paths = []

    for node in nodes:
        for sub_path in find_paths(graph, node, end):
            paths.append([start] + sub_path)

    return paths

print(find_paths({'A': ['B', 'C'], 'B': ['C', 'D'], 'C': 'D', 'D': 'E'}, 'A', 'E'))

输出

> python3 test.py
[['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'D', 'E'], ['A', 'C', 'D', 'E']]
>

我们可以看到从'A'到'E'共有3条路径-并且代码比您尝试的要简单。