您的位置:首页 > 其它

斐波那契数列

2010-10-11 14:04 309 查看
首先,我们做程序的和学习数学的对斐波那契数列都不陌生,它的递归定义如下
0 1 1 2 3 5 8 13 21 34 55 …
Fib(n) =Fib(n-1) + Fib(n-2)
n>=2;
Fib(0) = 0;
Fib(1) = 1;

递归程序很容易实现:
int fib(n){
if(n <=
0)
return
0;
else if(n =
1)
return
1;
else
return fib(n-1) + fib(n-2);
}
该递归算法的效率如何?估计使我们最想先知道的。令T(n)为fib(n)的计算次数。则
T(n)
= T(n-1) + T(n-2) +3; 很明显fib(n) =<T(n) n>1;
当n很大时候,T(n)有两条递归:T(n-1),T(n-2)。使得效率很低。看如下递归树:

T(5)





T(0)

T(1)





T(1)

T(2)













T(3)

T(1)

T(2)

T(2)

T(3)

T(4)

T(5)的递归树
很清楚的可以看到,带递归树种T(3)计算了两次,T(2)计算了三次….出现了很多重复计算的问题。
T(n)是个指数级别的算法。T(n) >fib(n) >2(n-2)(n-2次幂)

为减少不必要的计算,我们可以将先前的结果存储一下,用数组存储得到以下算法:
int fib1(int n){
int
a[100000];
a[0] = 0;
a[1] = 1;
for(int i = 2 ; i
<= n ;i++)
a[i] = a[i-1] + a[
i-2];
return a
;
}
此时的时间复杂度为 线性的。有了进一步的改进。

是否还能改进呢 ?
稍作改进可以将存储复杂度 n 变为常数级别。//0
1 1 2 3
int fib1(int n){
int
a = 0 , b = 1;
if(n <=0) return 0;
if(n == 1) return 1;
bool flag = true;
for(int i = 2 ; i <= n; i++)
{
If(flag)
{
a += b;
flag = false;
}
else
{
b += a;
flag = true;
}

}
If(flag)
return b;
else
return a;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: