递归
有许多重复计算
#include<iostream> #include<cstdio> using namespace std; int fibonacci(int x){ if(x<=1)return 1; return fibonacci(x-1)+fibonacci(x-2); } int main(){ int n; while(scanf("%d",&n)!=EOF){ int ans=fibonacci(n); printf("F(%d)=%d\n",n,ans); } }
递推---自底向上
#include<iostream> #include<cstdio> using namespace std; int F[1000000]; int main(){ int n; scanf("%d",&n); F[0]=1;F[1]=1; for(int i=2;i<=n;i++){ F[i]=F[i-1]+F[i-2]; } printf("F(%d)=%d\n",n,F[n]); }
自顶向下
#include<iostream> #include<cstdio> using namespace std; int F[1000]={0}; int f(int x){ if(x==0){F[0]=1;return F[0];} if(x==1){F[1]=1;return F[1];} if(F[x])return F[x];//避免重复计算,有值立即返回 else{ F[x]=f(x-1)+f(x-2); return F[x]; } } int main(){ int n; scanf("%d",&n); f(n); printf("F(%d)=%d\n",n,F[n]); }