题目描述:有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函数,那么,一个优化思想就是在每计算一个含新形参值的函数时就把函数值记录下来,从而在以后使用直接调用结果而不必重新递归计算。但是这样优化的似乎不是很好实现,因为要涉及到参数值的搜索,因此采用一种从下至上的计算形式,即把递归的过程反过来。递归是从上至下,它是从下至上。
下面是dalao的代码

#include <stdio.h>int f[100];
int n,s;int main(){f[0]=1;for(int i=1;i<=n;i++)for(int j=1;j<=s;j++)if(i-j>=0)f[i]+=f[i-j];printf("%d\n",f[n]);
}

(感觉和背包问题的优化思想有点相似的地方)
第一次写博客 以后继续加油了~

递归思想解决下楼梯问题相关推荐

  1. 递归思想解决输出目录下的全部文件

    刚刚了解了下递归思想 递归就是在方法内调用本方法 下面说一个实际的应用 输出目录下的全部文件,当目录中还有目录时,则进入目录输出里面的文件 import java.io.*; class ShowFi ...

  2. 吴昊品游戏核心算法 Round 10 —— 吴昊教你下围棋(利用递归来解决吃子的问题)...

    如图所示,此即为日本动漫棋魂中的千年佐为,也就是SAI.众所周知,围棋的规则相比于中国象棋,国际象棋等等都简单许多,真是因为更简单的规则,才诞生 了更复杂的逻辑.目前的围棋AI还很不行,最NB的应该是 ...

  3. LeetCode:递归思想的延伸,从斐波那契数列到爬楼梯模型

    题目描述: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 看到这个问题的第一反应其实我想到的是排列组合的思想去解答.比如有n阶, ...

  4. php猴子吃桃子问题n天,『PHP学习笔记』系列四:利用函数递归调用思想解决【斐波那契数列】问题和【猴子吃桃问题】问题...

    什么是函数递归思想? 递归思想:把一个相对复杂的问题,转化为一个与原问题相似的,且规模较小的问题来求解. 递归方法只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量. 但在 ...

  5. 递归下楼梯方法 5: Binets 方法

    Leetcode的解法五,下楼梯 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 这是一个有趣的 ...

  6. 运用贪心思想解决跳跃游戏

    运用贪心思想解决跳跃游戏 文章目录 运用贪心思想解决跳跃游戏 Jump Game I 1.题目描述 2.分析 3.代码 Jump Game II 1.问题描述 2.分析 3.动规代码[超时] 4.贪心 ...

  7. C++两个函数可以相互递归吗_通俗讲:数据结构递归思想

    通俗讲:数据结构递归思想 脑容量有限,拒绝花里胡哨 一个递归求阶乘的例子 #如5的阶乘 f(6)=6*5*4*3*2*1 def f(int n) {if n <= 0 : return 1re ...

  8. 递归 (一): 递归思想与 C++ 中的递归函数及两个递归应用示例 (斐波那契, 汉诺塔)

    您也可以在我的个人网站中查看此文:http://zhaokaifeng.com/?p=1502 谢谢您的访问 : ) 什么是递归 从汇编层面上看递归 在汇编层面上, 递归可以看作是两个循环, 每个循环 ...

  9. 动态规划算法思想解决找零钱问题

    前言 关于找零钱问题,网上已经有很多相关的资料以及优秀的文章博客等.这里写这篇博客的初衷很简单,就是为了方便自己,回过头来捡起这个知识能快一点,接受起来更易理解点:他人的文章写的再好,毕竟是别人的,学 ...

最新文章

  1. 事件冒泡和阻止事件冒泡
  2. opencv国际象棋_国际象棋是的
  3. python 分类 投票_LightGBM——提升机器算法(图解+理论+安装方法+python代码)
  4. Linux驱动(12)--LED驱动
  5. Datepicker-for-Bootstrap 日期选择插件
  6. 2018在职计算机科学硕士申请,2018年计算机专业硕士在职研究生备考指导
  7. 【网络-实验】rip最大有效跳数15
  8. SIM900A更改波特率
  9. 【笔记】EFCore SQLite 拼音汉字互换
  10. 基于中国新能源汽车税收政策下成都市场发展路线研究
  11. Hutool你值得拥有,吃相不要太难看
  12. isPrime 判断素数的函数
  13. ALGORITHMIC COMPOSITION AS A MODEL OF CREATIVITY
  14. 十月百度,阿里巴巴,迅雷搜狗最新面试五十三题(持续更新中10.16)
  15. 如何看待越来越多年轻人追捧「摸鱼哲学」,拒绝努力的年轻人真比老一辈活得更通透吗?
  16. ubuntu 20.04 耳机没有声音
  17. JS实现复制页面文字弹出消息提醒/在sweetalert(swal)弹出窗插件中加入html代码
  18. 微信公众号使用H5获取地理位置信息并定位
  19. java中金额元转万元工具类
  20. Linux 修改只读文件

热门文章

  1. matlab a123,空白A123作品集(分类目录番外文案已补齐)
  2. 神奇软体机器人|哈佛可穿戴式软体康复机器人问世
  3. JAVA利用反射模式调用实现类
  4. 阿里云云计算ACP学习(三)---对象存储OSS
  5. 高压电控产品电气设计入门与进阶(中)
  6. PPT动画教程:插入声音(转)
  7. This letter serves as notice of termination of the Apple Developer Program License Agreement
  8. python3 修饰器_Python3基础之: Decorator (修饰器)
  9. Arduino UNO 读取SD卡的信息
  10. html 实现收藏功能实现,js实现网页收藏功能