gpt4 book ai didi

python - 为什么递归次数 9 小于递归限制?

转载 作者:行者123 更新时间:2023-12-04 10:46:24 25 4
gpt4 key购买 nike

当我遇到这个问题时,我试图创建递归函数(不是真正的问题,但我很好奇,无法在其他任何地方找到答案)。当我运行代码时,它给了我一个递归错误以及它在超过递归限制之前重复了多少次。

[Previous line repeated 91 more times]
RecursionError: maximum recursion depth exceeded

在这种情况下,我将递归限制设置为 100,但重复次数为 91,同样,如果我将限制设置为 1000,则错误为 [Previous line repeated 991 more times] .我认为这是因为堆栈的前几个部分被程序的其他部分占用,所以我尝试将相同的函数添加到不同的代码段,但递归仍然少了 9 个。为什么会出现这种情况?

最佳答案

没有看到你的代码,我们不能准确地说,但几乎总是会有一定数量的代码创建的堆栈帧最终调用有助于上限的递归函数。如果您的递归已经接近上限,那么您的代码要么被破坏(无限或过度递归,在 Python 中根本不起作用),要么您需要设置一个明显更高的界限(大足以满足您深度但有界的递归以及合理的缓冲区)。

例如,即使在一个简单的交互式解释器 session 中,顶级调用也覆盖了一层递归。递归重复数据删除功能还会在递归行开始折叠之前显示几次;在我的 3.8.0 安装中,它显示重复的行三遍,然后告诉我最终副本重复了 996 次。新 session 的示例:

$ python3 -S -E  # -S -E isolates you as much as possible, making plainest interpreter possible
>>> def f(): return f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

其他最小方法也会发生相同的行为,例如 python3 -S -E -c 'f = lambda: f(); f()' .因此,至少对于 CPython 3.8.0,在绝对最小值上,您希望计数比实际递归限制(顶级帧,加上前三个扩展帧)少四。如果您运行的不是最基本的解释器(例如 IDLE、ipython),它们将通过堆叠在解释器核心上的层以交互方式运行,并且自动拥有的不仅仅是顶级框架。他们都努力隐藏这一点( ipython 将默认递归限制更改为 3000 而不是 1000;IDLE 似乎做了一些有点神奇的事情,以至于上面的同一个复制器死了,同时声称前一行重复了 1022 次,即使递归限制声称保持为 1000)。

您不会在 RecursionError 的回溯中看到这些添加的层。 ,因为解释器包装层在任何解释器堆栈本身展开之前捕获要显示的异常,并且回溯仅显示在捕获异常之前展开的那些帧。您可以使用 the traceback module 轻松查看这些附加层。通过运行(在您第一次调用过度递归函数的同一级别) traceback.print_stack() ,就我的 ipython3 而言session,显示另外 12 个帧(不包括实际调用的帧 traceback.print_stack())。同样,我的 IDLE 显示隐藏在主提示上方的三个附加框架。无论您如何运行代码,它都可能运行在五个堆栈帧的基础之上。

关于python - 为什么递归次数 9 小于递归限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59683722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com