gpt4 book ai didi

python - 递归限制是包含还是排除,额外的堆栈帧来自哪里?

转载 作者:行者123 更新时间:2023-12-01 15:13:58 26 4
gpt4 key购买 nike

我有这个递归阶乘函数:

def factorial(n):
if n < 2:
return 1
return n * factorial(n-1)

factorial(998)有效,但 factorial(999)将引发 RecursionError: maximum recursion depth exceeded in comparison .

为什么会在 factorial(999) 出现错误而不是 10001001 ? factorial(1)达到基本情况,因此调用 factorial 时应该只有一个堆栈帧函数, factorial(2)递归一次,所以它应该使用 2 个堆栈帧,依此类推。

递归限制是独占的还是包含的?如,如果你 setrecursionlimit(1000)当您达到 1000 个堆栈帧或超过 1000 个时,它会出错吗?

如果它是排他性的,为什么会在 n=999 上出错而不是 n=1000 ? n=999应该创建 999 个帧,而不是 1000 个。额外的堆栈帧来自哪里,使它达到 1000?如果限制是包容性的,那么额外的 2 个堆栈帧来自哪里,使其达到 1001 个堆栈帧?

最佳答案

你自己看。 Python 有很好的自省(introspection)工具:

import inspect

def factorial(n):
if n < 2:
return 1
print(len(inspect.stack()))
return n * factorial(n-1)

全局级别已经处于 1 深度。第一个函数调用是 2 深度的,因此在您的计算中有一个“额外”的堆栈帧。
def f():
print(len(inspect.stack()))

print(len(inspect.stack())) # 1
f() # 2

关于python - 递归限制是包含还是排除,额外的堆栈帧来自哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59347491/

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