斐波纳契数算法

时间:2013-12-09 17:31:17

标签: performance algorithm numbers fibonacci

Fibonacci序列最常见的递归算法如下所示:

unsigned int fib(unsigned int n){
   return (n < 2) ? n : fib(n - 1) + fib(n - 2);
}

在时间和空间复杂性方面,最有效的斐波那契算法是什么?

2 个答案:

答案 0 :(得分:1)

Jan提出的公式并不是很神奇(如果你对线性代数有基本的了解,我可以在这里证明它,并且感兴趣)。

这也是最快的方式。所以使用JavaScript(我可以用其他语言做到这一点,你只是喜欢它:

var sqrt5= Math.sqrt(5);
var phi = (1 + sqrt5) / 2;

function fibonacci(n){
     return (Math.pow(phi,n) - Math.pow(-phi,-n)) / sqrt5;
}

enter image description here

如果由于某种原因你非常想避免它 - 你可以使用一种非常基本的动态编程形式O(n)(而不是你现在拥有的指数时间)。而不是每次都计算最后两个数字 - 你记得它们。

function fib(n){
    var x=1,y=1,t;
    for(var i=1;i<n;i++){ 
        t=x;
        x+=y;
        y=t;
    }
    return x;
}

几乎立即返回fib(50)(递归方法需要很长时间)

答案 1 :(得分:1)

使用浮点计算整数通常是一个坏主意。我在上面看到的答案也是如此,使用封闭的公式。

有一个令人惊讶的知名公式,我将在下面说明。更好的方法是使用以下矩阵:[[1 1] [1 0]]。可以证明,将其提高到第n次幂会得到[[f(n + 1)f(n)] [f(n)f(n-1)]]。如果你不想使用矩阵,你可以使用4个参数,当然,使用快速取幂来得到O(log N)中f(N)的结果。

请在此处查看更详细的说明:Nth Fibonacci number O(log n)

如果您需要任何额外的细节,请告诉我。