鉴于产生斐波纳契数的功能:
def fibonacci(x, memory = {0:0, 1:1}):
if x not in memory:
memory[x] = fibonacci(x-1, memory)+fibonacci(x-2, memory)
return memory[x]
当我尝试一些任意大数,比如第4000个斐波纳契数时,我得到一个错误:
RuntimeError: maximum recursion depth exceeded
由什么引起的错误?在不牺牲效率的情况下,可以做些什么呢?我更喜欢这种迭代,因为通过迭代,计算甚至第50个位置在计算机上占用天文数据(读取:半分钟)。
答案 0 :(得分:2)
正如其他人所说,你已经达到了堆栈内存限制。在达到此限制之前,通常最多可以有50-100个最大嵌套递归调用。
我认为你可能对迭代(展开递归函数)有误解
def fib():
a=0
b=1;
c=1;
for x in range(4000):
c = a + b;
a = b;
b = c;
print c;
fib();
这个函数不会比递归函数花费更长的时间。
答案 1 :(得分:0)
我认为你达到了递归限制。 Here是指向类似帖子的链接,可能有所帮助。我建议您使用迭代,但我也遇到了这个代码来增加堆栈大小,但没有测试它:
import sys
sys.setrecursionlimit(10000) # change the '10000' to something that works
答案 2 :(得分:0)
在我看来,迭代比递归更好。因为
至于什么是递归限制,你可以看到here。它给出了递归限制的内容和原因的基本解释。如图所示,您可以将sys.setrecursionlimit
提供给您想要的任何值。
使用迭代器,这可以用于斐波那契系列:
def fib(a, b):
return b, a+b
for i in range(20):
if i in (0, 1):
print i
else:
print a
a, b = fib(a, b)