题目:求斐波那契数列的第n项
写一个函数,输出n,求斐波那契数列的第n项,斐波那契数列的定义如下:
第一种思路:
运用递归来解,以求解分f(10)为例,必须先要求得f(9)和f(8),同样要求得f(9),必须先要求得分f(8)和f(7)....依次类推,如下图:
如上图中,在树中,遍历节点求值时,会发现很多的节点是重复的,而且节点是数是重复会随着n的增大而急剧增加,计算量会随着n的增大而急剧增大。时间复杂度以n 的指数的方式递增,一旦求的数稍微大一点,速度就会非常的慢。
long long Fibonacci(unsigned int n)
{
if(n<=0)
{
return 0;
}
if(n==1)
{
return 1;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
改进思路:
当计算量太多时,我们只需要把已经得到的数列中间项保存起来,在下次需要计算的时候,我们先去查找一下,如果已经计算过就可以不用计算了。从树形结构的下面往上算计算,根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)......这样依次类推就可以算出第n项了,时间复杂度为O(n).
源代码:
#include<stdio.h>
//long long Fibonacci(unsigned int n)//低级的递归解法 时间复杂度以n的指数递增
//{
// if(n<=0)
// {
// return 0;
// }
// if(n==1)
// {
// return 1;
// }
// return Fibonacci(n-1)+Fibonacci(n-2);
//}
long long Fibonacci(unsigned int n) //较为改进 时间复杂度 O(n)
{
int result[]={0,1};
if(n<2)
{
return result[n];
}
long long FibNMinusOne=0;
long long FibNMinusTwo=1;
long long FibN=0;
for(unsigned int i=0;i<=n;i++)
{
FibN= FibNMinusOne+FibNMinusTwo;
FibNMinusTwo=FibNMinusOne;
FibNMinusOne=FibN;
}
return FibN;
}
int main()
{
printf("%d\n",Fibonacci(1));
printf("%d\n",Fibonacci(2));
printf("%d\n",Fibonacci(3));
printf("%d\n",Fibonacci(4));
printf("%d\n",Fibonacci(5));
printf("%d\n",Fibonacci(6));
printf("%d\n",Fibonacci(7));
printf("%d\n",Fibonacci(8));
return 0;
}