Fibonacci序列:递归深度过剩

时间:2014-12-04 06:05:20

标签: recursion

鉴于产生斐波纳契数的功能:

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个位置在计算机上占用天文数据(读取:半分钟)。

3 个答案:

答案 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)

在我看来,迭代比递归更好。因为

  1. 迭代比递归更容易阅读和追溯。
  2. 您可以使用Generators等概念来减少使用递归函数可能无法实现的内存负载。
  3. 至于什么是递归限制,你可以看到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)