【发布时间】:2014-11-14 21:07:34
【问题描述】:
我试图理解递归函数的堆栈溢出机制。 所以我使用了这个斐波那契函数:
def fib(n):
if n==1 or n==2:
return 1
return fib(n-1)+fib(n-2)
print (fib(555))
当我尝试使用这个函数来计算 fibo(999) 时,我遇到了这个 RuntimeError: maximum recursion depth exceeded in comparison 但是当我尝试计算 fibo(555) 时,python 不会打印任何运行时错误但仍然可以工作
我知道 python 中的默认递归 deeptHs 是 1000,但我不明白为什么当我尝试查找 fibo (555) 时 python 不打印运行时错误
THK'X 适合所有人
【问题讨论】:
-
请检查递归。使用 fib(999) 递归 aint 调用了 1000 次,但由于 fib(999) = fib(998) + fib(997)...所以它会创建一个超过 1000 的大长层次结构。
-
@simonzack 你认为这算作一个用例吗?我什至不认为这可以优化 TCO,至少不能完全使用传统方法。
-
@Abhi 错了。调用的深度约为 998。重要的是隐含的堆栈帧和调用者的堆栈帧,这会降低您实际可以使用的数量。
-
嗨朋友,我尝试用这个例子来更好地理解递归堆栈溢出机制,我理解 999 的情况但不是 555 的情况,我认为 python 必须显示运行时错误但他没有
-
@simonzack Not going to happen。在使用递归作为主要或唯一迭代手段的语言中,尾调用优化是必要的; Python 还有其他用于迭代的习语。您的尾递归函数效率低下?不要使用(尾)递归。正如 Veedrac 所指出的,这不是尾递归函数,它要求递归调用的返回值立即返回;不过
fib(n-1)的值需要保存,直到fib(n-2)返回并且两者可以相加。
标签: python recursion stack stack-overflow fibonacci