我有一个递归的阶乘函数:
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)而不是1000或1001上出错?factorial(1)符合基本情况,因此从调用factorial函数应该只有一个堆栈框架,factorial(2)只递归一次,所以它应该使用2个堆栈帧等等。
递归限制是排他性的还是包容性的?正如所述,如果您setrecursionlimit(1000),当您到达1000个堆栈帧时还是超过1000个时,它会出错吗?
如果它是外溢的,为什么它在n=999而不是n=1000上出错?n=999应该创建999帧,而不是1000。额外的堆栈帧从何而来,使其达到1000?如果限制包括在内,那么额外的2个堆栈帧从何而来,从而使其达到1001堆栈帧?
发布于 2019-12-15 20:03:36
你自己看吧。Python有很好的内省工具:
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() # 2https://stackoverflow.com/questions/59347491
复制相似问题