题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

看到这个问题的第一反应其实我想到的是排列组合的思想去解答。比如有n阶,那么步数最多的爬法肯定是一步一步爬,而步数最少的爬法则需要(n/2+n%2)步。从n到(n/2+n%2)减少的过程,也就意味着一次走2个台阶的步数增多,然后就是一个排列组合的算法。比如10个台阶走7步,那么就需要3步两个台阶以及4步一个台阶,抽象出来就是2,2,2,1,1,1,1的组合。
但是,如果需要用到递归思想,有需要该如何来解答呢?
此时需要将思路调转,从台阶少的逐步增加。1个台阶只有1中走法,2个台阶有2中走法,3个台阶有3种走法,4个台阶有5种走法。。。当然,我们不可能把所有可能都用纸笔去画出来,但是从大致的归来来看,似乎满足f(n)=f(n-1)+f(n-2),如果真的是这样的规律,那自然简单得多了。
我们可以这样想,已知n个台阶有x种走法,那么n+1个台阶,它到底是多了哪些走法?
首先,n个台阶的那x种走法对于n+1个台阶依然适用,只需要第n+1个台阶多爬一次就可以了,这就意味着最后一次只爬了一个台阶,那要是最后一次爬2个台阶呢?也就是第n和n+1个台阶一次爬,而剩下的那n-1个台阶的爬法,似乎就是f(n-1)嘛。果然,证实了我们的猜想:f(n)=f(n-1)+f(n-2)。

package com.leetcode.recurse;import java.util.HashMap;
import java.util.Map;public class MemoizationStairs {Map<Integer, Integer> map = new HashMap<Integer, Integer>();public static void main(String[] args) {System.out.println(new MemoizationStairs().climbStairs(4));}public int climbStairs(int n) {return getFactorial(n);}public int getFactorial(int n){if(map.containsKey(n)) {return map.get(n);}int result = 0;if(n==1) {result = 1;}else if(n==2) {result = 2;}else {//递归调用本身result = getFactorial(n-1)+getFactorial(n-2);}map.put(n, result);return result;}}

这个模型其实和斐波那契数列神似,都满足f(n)=f(n-1)+f(n-2),只是数列设定f(0)=0,f(1)=1,f(2)=f(0)+f(1)=1,而楼梯模型需要我们设定f(1)=1,f(2)=2,f(3)=f(1)+f(2)=3。

LeetCode:递归思想的延伸,从斐波那契数列到爬楼梯模型相关推荐

  1. 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)

    递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...

  2. 【第37天】斐波那契数列与爬楼梯 | 迭代的鼻祖,递推与记忆化

    本文已收录于专栏

  3. 【LeetCode】剑指 Offer 10- I. 斐波那契数列

    [LeetCode]剑指 Offer 10- I. 斐波那契数列 文章目录 [LeetCode]剑指 Offer 10- I. 斐波那契数列 一.递归 二.递归+哈希表 三.动态规划 总结 一.递归 ...

  4. 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

    学习内容 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 具体内容 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 ...

  5. python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...

    经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这些盘子移动完毕,世界就会灭亡.这个传说叫做梵天寺之塔问题( ...

  6. 递归与递推 输出斐波拉契数列的前n项 python

    输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...

  7. 古老递归问题(兔子版本斐波那契数列)

    题目: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 首先,我目前还是菜鸟,若解答有问题,直接评论戳我吧! 这是 ...

  8. 递归、递推法斐波那契数列

    编写2个函数,分别采用递归和递推方法计算斐波那契数列的前n项,函数返回列表,该列表中存放斐波那契数列,并写出程序调用这2个函数,输出斐波那契数列. #递归方法 def fib1 (n): if n & ...

  9. D38| DP理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

    DP理论基础 重要知识点: 1.动规和贪心的区别:动规是由前一个状态推导出来的,而贪心是局部直接选最优的 2.动规五部曲: 1)确定dp数组(dp table)以及下标的含义 2)确定递推公式 3)d ...

最新文章

  1. Java - 正则表达式的运用(Pattern模式和Matcher匹配)
  2. 有哪些好用不火的软件?
  3. HashMap的实现原理及其特点
  4. jquery:临时禁止鼠标滚动 How to disable scrolling temporarily?
  5. Spring Boot项目CentOS域名的绑定
  6. android学习笔记---手机拍照功能的实现,及原理
  7. freebsd下安装php-intl扩展
  8. CSDN资源上传记录(持续更新)
  9. PS、PR素材资源网站
  10. ps特效制作人物碎片飞溅效果
  11. 手机浏览器点击标签出现蓝色背景解决方法
  12. 计算机网络教程第五版|微课版 - 第二章 物理层 - 重点概念
  13. python祝福语_Python | 微信自动回复祝福语
  14. AcWing 1022 宠物小精灵之收服
  15. 直播预告 | ICLR专场一
  16. [转] 最火的42部美剧,练听力的不二之选
  17. 谁需要闪光灯? CSS3动画蜘蛛侠卡通
  18. 【C语言练习4】根据公式计算π的值,π=4-4/3+4/5-4/7+4/9+... 打印出一个表格来显示,用公式中的1项、2项、3项...计算出来π的近似值
  19. 淘宝主图SKU图采集下载
  20. 普通话证计算机证英语证,老师的必备证书:教师资格证、普通话证、英语四六级、计算机二级...

热门文章

  1. linux重启配置文件,rEFInd启动管理器配置文件详解
  2. 如何在电脑上删除磁盘碎片
  3. win11快捷键失效怎么办 windows11快捷键失效的解决方法
  4. 基于TCP协议的Socket通信,实现文件断点续传
  5. 引commons-io工具类做文件的复制及导出
  6. VUE使用过滤器来格式化当前时间
  7. 洛谷——P1320 压缩技术(续集版)
  8. input 禁止输入特殊字符
  9. opencv之cv::Mat像素遍历
  10. 计算机兴趣小组的意义,计算机兴趣小组总结