斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。
首先来一个通常版本:
int fib1(int N){
int first = 0,second = 1,sum;
if(N<2){
return N;
}
for(int i=1;i++ < N;){
sum = first + second;
first = second;
second = sum;
}
return sum;
}
改进1:去掉对特殊数据N=0和1的判断,让代码统一处理所有数
if(N<2){
return N;
}
修改后:
int fib2(int N){
int first = -1,second = 1,sum;
for(int i=0;i++ <= N;){
sum = first + second;
first = second;
second = sum;
}
return sum;
}
观察上面代码,second 和 sum是一样的,有没有办法节省一点内存呢?可以试试下面的办法:
改进2:
int fib3(int N){
int fb_tb[2]={0,1};
for(int i=1;i++ < N;){
fb_tb[i%2] = fb_tb[0] + fb_tb[1];
}
return fb_tb[N%2];
}
这个办法,省下了一个变量:
sum
和两条赋值语句 :
first = second;
second = sum;
但是增加了两个取余操作: %
练习过程中发生了一个小插曲:
int fib4(int N){
int fb_tb[2]={0,1};
for(int i=2;i <= N;++i){
fb_tb[i%2] = fb_tb[0] + fb_tb[1];
}
return fb_tb[N%2];
}
至于fib4和fib3的区别:你品,你细品。。。
为什么不用递归实现斐波那契数呢?
int fib(int N){
if(N<2) {
return N;
}else{
return fib(N-1) + fib(N-2) ;
}
}
虽然用递归看起来简单明了行数少,但是仔细想想,这个办法太费内存了,同时也没有节约时间。看下图:
这是fib(5)递归展开的样子,产生了重复的计算。
最后,把for循环写成:for(int i=1;i++ < N;) 而不是:
for(int i=1;i < N;i++ )只是想提醒 ++ 的用法。