繁体   English   中英

斐波那契数算法

[英]Fibonacci numbers algorithm

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

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

就时间和空间复杂度而言,最有效的斐波那契算法是什么?

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;
}

在此处输入图片说明

如果出于某种原因您强烈希望避免这种情况-您可以使用非常基本的动态编程形式来执行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 0]]。 可以证明,将其提高到第n次方将得到[[f(n + 1)f(n)] [f(n)f(n-1)]]。 如果您不想使用矩阵,则只能使用4个参数,并且当然可以使用快速幂运算来获得O(log N)中f(N)的结果。

在此处查看更详细的说明: 第N个斐波那契数O(log n)

让我知道您是否需要任何其他详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM