递归思想解决下楼梯问题

博客探讨了如何使用递归思想解决下楼梯问题,其中n个台阶允许一次下1到m个。文章通过分析递归函数的实现,指出在理解和优化递归过程中可能出现的错误,如未能正确理解辅助变量tol的作用。作者提到了从上至下和从下至上的递归计算方式,并对比了两者的效率。最后,展示了dalao的优化代码,指出这个问题与背包问题的优化思路有相似之处,鼓励自己继续学习和进步。
摘要由CSDN通过智能技术生成

题目描述:有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

	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值