分裂的运行时间并征服斐波纳契计划

时间:2011-07-10 07:59:19

标签: algorithm recurrence

count = 0
def fibonacci(n):
    global count
    count = count + 1
    if not isinstance(n, int):
        print ('Invalid Input')
        return None

    if n < 0:
        print ('Invalid Input')
        return None

    if n == 0:
        return 0

    if n == 1:
        return 1

    fib = fibonacci(n-1) + fibonacci(n-2)
    return fib

fibonacci(8)
print(count)

我试图找出这个斐波纳契计划的运行时间。任何人都可以帮我解决相同的递归关系..

T(n)= T(n-1)+ T(n-2)......这里的运行时间计算是什么?

谢谢...:)

4 个答案:

答案 0 :(得分:1)

我假设你的意思是'斐波那契',你说的是'阶乘'。

在每个级别,您有两次拨打fibonacci()。这意味着您的运行时间将为O(2 ^ n)。你可以通过绘制递归树来看到这一点。

有关更好更详细的说明,请参阅Computational complexity of Fibonacci Sequence

答案 1 :(得分:0)

看看this,特别是time.clock()。在函数调用之前和之后调用时钟,计算差值并获得经过的时间。

顺便问一下:为什么斐波纳契的代码如此之多?

def fib (n): return fib (n - 1) + fib (n - 2) if n > 1 else n

答案 2 :(得分:0)

你可以看到wiki, 但简单的观察正如你所写:

 T(n) < 2T(n-1) = 2 * 2 T(n-2) =.... = 2^(n-1)T(1) = 2^(n-1). So T(n) is in O(2^n).

实际上你应该解决x^2 = X + 1因此x将是phi1 = (1+sqrt(5))/2phi2 = (1-sqrt(5))/2所以结果是phi1 ^ n + phi2 ^n但是因为大{n} phi2小于1我们可以说它是T(n)=phi1^n

编辑: *但您可以编辑当前的解决方案以获取O(n)运行时间(从第一个元素开始循环)。

答案 3 :(得分:0)

运行时是2F(n + 1) - 1次调用,其中n是第n个Fibonacci数。

这是一个快速归纳证明:

作为基本情况,如果n = 0或n = 1,那么我们只进行一次调用,并且F(1)= F(2)= 1,我们得到2F(n + 1) - 1 = 1。

对于归纳步​​骤,如果n> 1,然后我们进行尽可能多的调用以评估n-1和n-2上的函数。通过归纳假设,这需要2F(n)-1 + 2F(n-1)-1 = 2F(n + 1) - 2个递归调用来完成。但是,因为我们也计算当前的函数调用,所以我们在其中添加一个以获得2F(n + 1) - 1的所需。

注意2F(n + 1) - 1是第n个Leonardo数的表达式,其中

L(0)= L(1)= 1

L(n + 2)= L(n)+ L(n + 1)+ 1

Saeed指出,它生长在Θ(Φ n )。但是,这个答案在数学上是精确的。

这更准确地说是您感兴趣的运行时,因为您需要考虑每个递归调用本身正在完成的工作。如果你放弃+1术语,你就可以获得斐波那契系列的作品!