提到斐波那契大家可能就会想到递归算法,递归算法简洁方便却存在一定问题,当数比较大时需要很多次递归,每一个数都需要重复的计算,效率很差,栈空间可能也会被消耗完。
每次计算后将上两次的值保存下来
int fbonaqie_1(int k)
{
int lasttwo = 0;
int lastone = 1;
int now = 0;
if (k<=0)
return 0;
if (k == 1)
return 1;
else
{
while ( k-->1)
{
now = lastone + lasttwo;
lasttwo = lastone;
lastone = now;
}
return now;
}
}
下面是两种方面效率的比较
#include <stdio.h>
#include <time.h>
int fbonaqie_1(int k)
{
int lasttwo = 0;
int lastone = 1;
int now = 0;
if (k<=0)
return 0;
if (k == 1)
return 1;
else
{
while ( k-->1)
{
now = lastone + lasttwo;
lasttwo = lastone;
lastone = now;
}
return now;
}
}
int fbonaqie_2(int k)
{
if (k<=0)
return 0;
if (k==1)
return 1;
else
return fbonaqie_2(k-1) +fbonaqie_2(k-2);
}
int main()
{
int ret1 = 0;
int ret2 = 0;
clock_t start1,end1,start2,end2;
start1 = clock();
ret1 = fbonaqie_1(25);
end1 =clock();
start2 = clock();
ret2 = fbonaqie_2(25);
end2 =clock();
printf("%d fbonaqie_1() use time is %f\n",ret1,difftime(end1,start1));
printf("%d fbonaqie_2() use time is %f\n",ret2,difftime(end2,start2));
return 0;
}
值为25时两种方法已经有明显差别
值为35时差别就更大了
传入50时就要等很久