在Python中出现了“最大递归深度在比较中超过”的错误?

3

我正在尝试找到每个节点与起始节点之间的距离,节点之间的连接关系以字典形式给出。

我的代码可以很好地处理像这个例子这样的小字典,但是在节点数超过20个的字典上会出现错误。

    if child != parent and child not in my_list:
RecursionError: maximum recursion depth exceeded in comparison

我卡在这里了,有人能帮我吗? 在此输入图片描述 我的代码:
def compute_distance(node, dic, node_distance, count, parent, my_list):
    children = dic[node]
    node_distance[node].append(count)
    for child in children:
        if child != parent and child not in my_list:
            compute_distance(child, dic, node_distance, count + 1, node, children)
    node_distance_dic = {}
    node_distance_dic = {k: min(v) for k, v in node_distance.items()}
    return node_distance_dic

if __name__ == '__main__':
    starting_node = 9
    dic = {0: [1, 3], 1: [0, 3, 4], 2: [3, 5],
                3: [0, 1, 2, 4, 5, 6], 4: [1, 3, 6, 7],
                5: [2, 3, 6], 6: [3, 4, 5, 7, 8],
                7: [4, 6, 8, 9], 8: [6, 7, 9], 9: [7, 8]}  
    print(compute_distance(starting_node, dic, defaultdict(list), 0, 0, []))

输出(键=key,值=value)为节点和距离。
{0: 4, 1: 3, 2: 4, 3: 3, 4: 2, 5: 3, 6: 2, 7: 1, 8: 1, 9: 0}

这是因为你的递归栈呈指数级增长。尝试使用迭代算法或某种形式的记忆化。虽然这个算法对于像20个节点这样的小数量应该没问题,但通过增加堆栈深度,它对于更大或更密集的图形将不够高效。 - EvilTak
抱歉,这是一个字典。我编辑了我的帖子。 - Joe
我把它改成了node_distance。 - Joe
2个回答

1
我猜my_list是用来跟踪已经访问过的节点,但你从未更新它。因此,你应该添加正在处理的节点,以免在已经遍历过的节点上进行递归调用。目前,你的代码一旦图中存在循环,就会进入无限循环。另外,别忘了将其传递到下一个级别:
def compute_distance(node, dic, node_distance, count, parent, my_list):
    my_list.append(node)
    ...
    compute_distance(child, dic, node_distance, count + 1, node, my_list)
    ...

然而,这种方法并不计算从起始节点到每个其他节点的最短路径,它只是对图进行简单的遍历(底层算法为DFS)。
为了实现你想要的,即从源节点到每个其他节点的最小距离,你应该看一下广度优先搜索(通常称为BFS)。
它将在线性时间内解决你的问题。

我正在通过在第5行再次插入子元素来保持进展。 - Joe
因为你在第5行将children用作最后一个参数。 - T. Claverie

0

这实际上与图的大小没有任何关系。即使对于这个微小的图,您已经拥有了无限递归:

dic = {0: [1, 3], 1: [2, 0], 2: [3, 1], 3: [0, 2]}
compute_distance(0, dic, defaultdict(list), 0, 0, [])

如果0:[1]之间有连接,那么1:[0]之间也必须有连接,因此字典为{0:[1,3], 1:[0,2], 2:[1,3], 3:[0,2]}。 - Joe
啊,对了。虽然这仍然会导致无限递归。而且,看起来我已经想过这个问题了,对于有向图,三个节点就足够了({0:[1],1:[2],2:[0]})。 - Stefan Pochmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接