python - 如何知道可以在 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()
会给我当前设置的任何“限制”。
解决方案
您已经找到了问题的答案,但您仍然没有关于如何绕过递归限制的答案。
简单的方法是维护自己的堆栈。这可以像这样首先进行深度。
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)
推荐阅读
- css - chakra UI - 顶部垂直对齐
- javascript - 反应原生文档选择器在发布模式下不工作
- php - PDO::lastInserteId() 是否从特定表返回最后插入的 id?
- java - Spring Cloud Gateway 资源服务器:不存在主题替代名称
- javascript - 如何在不重新加载页面的情况下添加类
- c# - WPF:在代码中从祖先调用 ICommand
- azure - 错误消息:当前 SKU 不支持“私有端点连接”
- spring-boot - 表包含在spring应用程序中引用多个物理列名的逻辑列名
- python - 通过度量学习进行相似图像搜索
- java - 如何在Java中按一列对二维数组进行排序