斐波那契数列
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(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;
}
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(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;
}
相关文章推荐
- 计蒜客题库:斐波那契数列题解(模拟)
- 斐波那契 (Fibonacci)数列
- 斐波那契(Fibonacci)数列的计算效率
- SZ斐波那契数列
- 进程间利用管道进行通信:打印斐波那契数列
- 斐波那契数列
- 斐波那契数列及其运用
- acm-C++经典程序训练---斐波那契(Fibonacci)数列
- Java实现斐波那契数列
- 09Fibonacci斐波那契数列
- c 实现斐波那契(fibonacii)数列
- 斐波那契数列
- 斐波那契数列的第n项
- 斐波那契数列-矩阵乘法
- hdu 4549 M斐波那契数列
- 斐波那契数列之动态规划
- 题目1387:斐波那契数列
- 斐波那契数列的递归与非递归算法实现及其时间复杂度
- 斐波那契数列之老师的难题
- 斐波那契数列的矩阵解法(java实现)