【斐波拉契:记忆化搜索】

斐波拉契数列:     1  1  2  3  5  8  13....

第几个数(下标) :  0  1  2  3  4  5  6 ....

问题:输入下标数字,输出相应数字。

  (1) 传统的递推解法:

#include<cstdio>
#include<iostream>
using namespace std;
int main() 
{  int n,f[100];
	scanf("%d",&n);
	f[0]=1; f[1]=1;
	for (int i=2; i<=n; i++) f[i] = f[i-1]+f[i-2];
	cout << f[n] <<endl;
	return 0;
}

  (2)递归求解:

#include<cstdio>
#include<iostream>
using namespace std;
int n,f[100],x;
int digui(int n)
{
	if (n==0) return 1;
	if (n==1) return 1;
	int x =digui(n-1)+digui(n-2);
	return x;
}
int main() 
{
	scanf("%d",&n);
	f[0]=1; f[1]=1;
    cout<<digui(n);
	return 0;
}

  (3)递归+记忆化搜索解法

核心:将一维数组利用起来,存放上一次的解避免了后续的重复计算。

#include<cstdio>
#include<iostream>
using namespace std;
int n,f[100],x;

int digui(int n)
{ 
	if (f[n]!=0) return f[n];
	f[n]=digui(n-1)+digui(n-2);
	return f[n];
}

int main() 
{
	scanf("%d",&n);
	f[0]=1; f[1]=1;
    cout<<digui(n);
	return 0;
}

  

 

posted on 2018-11-28 11:10  lcdxjsj  阅读(117)  评论(0编辑  收藏  举报

导航