【斐波拉契:记忆化搜索】
斐波拉契数列: 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; }