首页 > 解决方案 > 如何知道可以在 Python 3 中为平台设置的最大递归深度?

问题描述

我正在实施深度优先搜索算法以获取具有大量节点(超过 800,000)的图的强连通分量。

运行时,我收到以下错误:

RecursionError: maximum recursion depth exceeded in comparison

为了解决这个问题,我使用了sys.setrecursionlimit(numNodes)函数的帮助。执行此操作时,IDLE 开始执行代码,但随后自动重新启动而不给出任何输出。

基于快速的网络搜索(例如),我认为这是因为 IDLE 在通过这么多节点递归时超出了内存限制。

对于 numNodes = 20000,sys.setrecursionlimit(3000)是否有效

对于 numNodes = 40000,sys.setrecursionlimit(5000)是否有效

对于 numNodes = 80000,sys.setrecursionlimit(5000)重新启动 IDLE。(注意这里,它不显示 RecursionError,但仅重新启动 IDLE)

疑问limit:我可以为sys.setrecursionlimit(limit)我的平台设置的最大值是多少?

更新:关于堆栈溢出的其他类似问题询问如何更改值或什么是最大递归深度。我需要了解“限制”的最大可能值是多少。sys.getrecursionlimit()会给我当前设置的任何“限制”。

标签: pythonpython-3.xalgorithmrecursionsys

解决方案


您已经找到了问题的答案,但您仍然没有关于如何绕过递归限制的答案。

简单的方法是维护自己的堆栈。这可以像这样首先进行深度。

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)

推荐阅读