Fibonacci序列最常见的递归算法如下所示:
unsigned int fib(unsigned int n){
return (n < 2) ? n : fib(n - 1) + fib(n - 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;
}
如果由于某种原因你非常想避免它 - 你可以使用一种非常基本的动态编程形式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)
如果您需要任何额外的细节,请告诉我。