来源:JK老班
题目:n阶楼梯,每次跳1 或 3 或 4阶,问有几种跳法?
1.递归:
#include<iostream>
using namespace std;
int count=0;//调用次数
int F(int i){
count++;
if(i==0) return 1;
int sum=0;
if(i>=1) sum+=F(i-1);
if(i>=3) sum+=F(i-3);
if(i>=4) sum+=F(i-4);
return sum;
}int main(){
int n=20;
cout<<F(n)<<endl;
cout<<"count="<<count;
}
大量重复计算。
可以将算过的返回加起来,避免重复计算。
2.递归优化:
#include<iostream>
using namespace std;
int count=0;//调用次数
int A[100]={0};int F(int i){
count++;
if(A[i]!=0) return A[i];
if(i==0) return 1;
int sum=0;
if(i>=1) sum+=F(i-1);
if(i>=3) sum+=F(i-3);
if(i>=4) sum+=F(i-4);
A[i]=sum;
return sum;
}int main(){
int n=20;
cout<<F(n)<<endl;
cout<<"count="<<count;
}
查看实际计算次数:
#include<iostream>
using namespace std;
int count=0;
int A[100]={0};int F(int i){
if(A[i]!=0) return A[i];
if(i==0) return 1;
count++;
int sum=0;
if(i>=1) sum+=F(i-1);
if(i>=3) sum+=F(i-3);
if(i>=4) sum+=F(i-4);
A[i]=sum;
return sum;
}int main(){
int n=20;
cout<<F(n)<<endl;
cout<<"count="<<count;
}
楼梯阶数多时,递归调用次数还是很多的。
3.动态规划:
#include<iostream>
using namespace std;
int count=0;
int A[100]={0};int main(){
int n=40; A[0]=1;
for(int i=1;i<=n;i++){
A[i]=A[i-1];
if(i>=3) A[i]+=A[i-3];
if(i>=4) A[i]+=A[i-4];
}
cout<<A[n];
}