只有刻意练习递归,才能掌握递归-递归专题5-求斐波那契数列第n项

一、时间效率低的写法

如下:

#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 项,从数组中查询即可。

这是程序设计竞赛经常使用的技巧。

猜你喜欢

转载自blog.csdn.net/weixin_43917370/article/details/106601430