题目:求斐波那契数列的第n项。
斐波那契数列的定义:输入n,则第n项为:当n = 0,f(0)=0;当n = 1;f(1) = 1;当n>1时,f(n) = f(n-1) +f(n-2)。
解题:
方法一:从上门的公式可以看出这是一个递归的形式,我们可以用递归的方法实现。
#include <stdio.h>
int Fibobacci(unsigned int n)
{
if(n == 0)
{
return 0;
}
if(n == 1)
{
return 1;
}
return Fibobacci(n-1) + Fibobacci(n-2);
}
void main()
{
unsigned int n;
int fn;
printf("输入一个非负数:");
scanf("%d",&n);
printf("您输入的数为n = %d\n",n);
fn = Fibobacci(n); //求第n项
printf("您求解的第n项为 = %d\n",fn);
}
采用递归的方式计算,其时间复杂度是以n的指数的方式递增的。
进一步分析,如果将每次f(n)的前2两项的值存起来,就可以相加得到下一个f(n),依次类推,时间复杂度为O(n)。
void main()
{
unsigned int n;
int result[2] = {0,1};
int fn;
int fn1 = 1;
int fn2 = 0;
unsigned int i;
printf("输入一个非负数:");
scanf("%d",&n);
printf("您输入的数为n = %d\n",n);
if(n < 2)
{
printf("您求解的第%d项为 = %d\n",n,result[n]);
}
else
{
for(i = 2; i <= n;i++)
{
fn = fn1 + fn2;
fn2 = fn1;
fn1 = fn;
}
printf("您求解的第%d项为 = %d\n",n,fn);
}
}
显然方法2更好,时间复杂度降下来了。