我正在实现深度优先搜索算法,以获得具有大量节点(超过800000个节点)的图的强连接组件。
运行时,出现以下错误:

RecursionError: maximum recursion depth exceeded in comparison

为了解决这个问题,我使用了sys.setrecursionlimit(numNodes)函数的帮助。
执行此操作时,IDLE开始执行代码,但随后会自动重新启动,而不提供任何输出。
基于一个快速的web搜索(对于example),我认为这是因为当通过这么多节点递归时,空闲超过了内存限制。
对于numnodes=20000,sys.setrecursionlimit(3000)起作用
当numnodes=40000时,sys.setrecursionlimit(5000)起作用
对于numnodes=80000,sys.setrecursionlimit(5000)重新启动空闲。(注意,这里不显示RecursionError,只重新启动空闲)
疑问:我能为我的平台设置的的最大值是多少?
更新:关于堆栈溢出的其他类似问题,请询问如何更改值或最大递归深度。我需要理解“极限”的最大可能值是什么。limit将给出当前设置的任何“限制”。

最佳答案

您已经找到了问题的答案,但是对于如何绕过递归限制,您仍然没有答案。
简单的方法是维护自己的堆栈。这样做可以先达到深度。

todo = [starting, stuff]
while 0 < len(todo):
    task = todo.pop()
    do work
    todo.extend(future_tasks)

在这种形式下,从DFS切换到BFS需要从堆栈切换到队列这在Python中很简单:
todo = [starting, stuff]
while 0 < len(todo):
    task = todo.pop(0)  # CHANGED HERE
    do work
    todo.extend(future_tasks)

08-24 21:09