我正在实现深度优先搜索算法,以获得具有大量节点(超过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)