斐波拉契数列(理解记忆化+递归)

*递推

用数学公式可解

#include
using namespace std;
int fib[25];//求斐波拉契数列的第20项
int main()
{
	fib[1]=fib[2]=1;
	
	for(int i=3;i<=20;i++)
		fib[i]=fib[i-1]+fib[i-2];
	cout<

*记忆化+递归

1.为什么单纯的递归比递推时间复杂度很高呢

想一个函数递归调用的树,有些分支之前计算过,但是调用的时候就又算了一遍,所以我们最好存下之前算过的

2.是怎么想到记忆化和递归的算法呢

就来源于原始的暴力搜索/暴力枚举

3.代码

#include
#include
using namespace std;

const int N=1010;//浅求前1009个数吧
int data[N],n;//存斐波拉契数,初始值是0,表示没存过
int fib(int n)
{
	if(n==1||n==2)
	{
		data[n]=1;
		return 1;
	}
	if(data[n]!=0)	return data[n];
	data[n]=fib(n-1)+fib(n-2);
	return data[n];
}
int main()
{
	cin>>n;
	cout<

*单纯的递归

#include
#include
using namespace std;

const int N=1010;//浅求前1009个数吧
//int data[N];//存斐波拉契数,初始值是0,表示没存过
int n;
int fib(int n)
{
	if(n==1||n==2)
	{
	//	data[n]=1;
		return 1;
	}
//	if(data[n]!=0)	return data[n];
//	data[n]=fib(n-1)+fib(n-2);
//	return data[n];
	return fib(n-1)+fib(n-2);
}
int main()
{
	cin>>n;
	cout<

我写的时候犯了个小错误(这是个什么鬼w(゚Д゚)w)

fib(n)=fib(n-1)+fib(n-2);
return fib(n);

在返回值时调用自身!

你可能感兴趣的:(c++,算法,c语言)