【斐波拉契:记忆化搜索】
斐波拉契数列: 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;
}
浙公网安备 33010602011771号