首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归限制是包含还是排他性的,额外的堆栈帧从何而来?

递归限制是包含还是排他性的,额外的堆栈帧从何而来?
EN

Stack Overflow用户
提问于 2019-12-15 19:46:08
回答 1查看 121关注 0票数 4

我有一个递归的阶乘函数:

代码语言:javascript
复制
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堆栈帧?

EN

回答 1

Stack Overflow用户

发布于 2019-12-15 20:03:36

你自己看吧。Python有很好的内省工具:

代码语言:javascript
复制
import inspect

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

全球层面已经达到了1深度.第一个函数调用是2深度,所以在计算中有一个额外的堆栈框架。

代码语言:javascript
复制
def f():
    print(len(inspect.stack()))

print(len(inspect.stack())) # 1
f() # 2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59347491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档