题目描述:有n个台阶,每次最多可以下m个,求一共有多少种下楼梯的策略。
下面是源代码
#include <stdio.h>
#include <stdlib.h>
int Stair(int h,int s){
int ans,tol=0;
for(int i=1;i<=s&&i<=h;i++){
if(h-i==0) tol+=1;
else tol+=Stair(h-i,s);
}
ans=tol;
return (ans);
}
int main (void){
int s,h,ans;
scanf("%d%d",&h,&s);
ans=Stair(h,s);
printf("%d\n",ans );
system("pause");
return 0;
}
分析显然用递归函数来模拟所有下楼梯的可能情形。
若第一次下1个台阶,则求n-1个台阶的策略
若第一次下2个,则求n-2个台阶的策略
以此类推
每次下楼梯的策略总数为:
for(int i=1;i<=m&&i<=n;i++){
if(h-i==0) tol+=1;
else tol+=Stair(h-i,s);
}
即下完i个台阶的剩下台阶策略的和(显然i不能超过m和n的任何一个)
因为m是待定的,所以不能直接通过明确的表达式写出函数的递归形式,需要借助一个辅助变量tol保存下一层的和,再传递给递归的结果ans
ans=tol;
做题过程中的错误:未能完全理解tol的作用,将递归结束时的
if(h-i==0) tol+=1; 语句写成 tol=1,使之前积累的递归结果全部作废。
然而,这样从上而下的递归需要反复计算重复的Stair函数,那么,一个优化思想就是在每计算一个含新形参值的函数时就把函数值记录下来,从而在以后使用直接调用结果而不必重新递归计算。但是这样优化