递归
有许多重复计算
#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]);
}