一、时间效率低的写法
如下:
#include <stdio.h>
int fib2(int n)
{
if(n==1 || n==2)
{
return 1;
}
return fib2(n-1)+fib2(n-2);
}
int main()
{
printf("%d\n",fib2(6));//1,1,2,3,5,8...
return 0;
}
这种方法的缺点是:当n越大时,需要的重复计算越多。
二、空间换时间,提升时间效率
下面的方法,没有重复计算,仍然属于自底而上的计算,和一般书本上写的不同。
代码如下:
#include <stdio.h>
void fib(int *A,int n,int i)
{
if(i>n)
{
return 0;
}
A[i]=A[i-1]+A[i-2];
fib(A,n,i+1);
}
int main()
{
int n=30;
int fibs[n+1];
fibs[1]=fibs[2]=1;
fib(fibs,30,3);
printf("%d\n",fibs[6]);//1,1,2,3,5,8...
return 0;
}
该方法多引入了一个数组,先把数列的前n项都计算出来。
以后,每遇到找数列的第 i 项,从数组中查询即可。
这是程序设计竞赛经常使用的技巧。