用递归将问题分解为规模更小的子问题进行求解
例题:爬楼梯
树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数
例如三级楼梯,可以每次走1级,或者第一次走1级第二次走2级,或者第一次走2级第二次走1级,共3种走法。
输入N,1<=N<=30,,输出走法数。
思路就是写出递推公式,
n级台阶的走法=先走1级,n-1级台阶的走法+先走2级+n-2级台阶的走法
f(n)=f(n-1)+f(n-2)
边界条件:n<0时,没有走法;n=0时,有一种走法,就是不走(或者这样理解,n=1时,只剩下一种走法就是走1级;n=2时有两种走法,走1级或者走2级)。
代码
#include<iostream>
using namespace std;
int N;
int fn(int n)
{
if(n<0) return 0;
else if(n==0) return 1;
return fn(n-1)+fn(n-2);
}
int main(){
while(cin>>N)
{
cout<<fn(N)<<endl;
}
return 0;
}