[英]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.