LeetCode:递归思想的延伸,从斐波那契数列到爬楼梯模型
题目描述:
假设你正在爬楼梯。需要 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:递归思想的延伸,从斐波那契数列到爬楼梯模型相关推荐
- 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)
递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...
- 【第37天】斐波那契数列与爬楼梯 | 迭代的鼻祖,递推与记忆化
本文已收录于专栏
- 【LeetCode】剑指 Offer 10- I. 斐波那契数列
[LeetCode]剑指 Offer 10- I. 斐波那契数列 文章目录 [LeetCode]剑指 Offer 10- I. 斐波那契数列 一.递归 二.递归+哈希表 三.动态规划 总结 一.递归 ...
- 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
学习内容 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 具体内容 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 ...
- python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...
经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这些盘子移动完毕,世界就会灭亡.这个传说叫做梵天寺之塔问题( ...
- 递归与递推 输出斐波拉契数列的前n项 python
输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...
- 古老递归问题(兔子版本斐波那契数列)
题目: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 首先,我目前还是菜鸟,若解答有问题,直接评论戳我吧! 这是 ...
- 递归、递推法斐波那契数列
编写2个函数,分别采用递归和递推方法计算斐波那契数列的前n项,函数返回列表,该列表中存放斐波那契数列,并写出程序调用这2个函数,输出斐波那契数列. #递归方法 def fib1 (n): if n & ...
- D38| DP理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
DP理论基础 重要知识点: 1.动规和贪心的区别:动规是由前一个状态推导出来的,而贪心是局部直接选最优的 2.动规五部曲: 1)确定dp数组(dp table)以及下标的含义 2)确定递推公式 3)d ...
最新文章
- Java - 正则表达式的运用(Pattern模式和Matcher匹配)
- 有哪些好用不火的软件?
- HashMap的实现原理及其特点
- jquery:临时禁止鼠标滚动 How to disable scrolling temporarily?
- Spring Boot项目CentOS域名的绑定
- android学习笔记---手机拍照功能的实现,及原理
- freebsd下安装php-intl扩展
- CSDN资源上传记录(持续更新)
- PS、PR素材资源网站
- ps特效制作人物碎片飞溅效果
- 手机浏览器点击标签出现蓝色背景解决方法
- 计算机网络教程第五版|微课版 - 第二章 物理层 - 重点概念
- python祝福语_Python | 微信自动回复祝福语
- AcWing 1022 宠物小精灵之收服
- 直播预告 | ICLR专场一
- [转] 最火的42部美剧,练听力的不二之选
- 谁需要闪光灯? CSS3动画蜘蛛侠卡通
- 【C语言练习4】根据公式计算π的值,π=4-4/3+4/5-4/7+4/9+... 打印出一个表格来显示,用公式中的1项、2项、3项...计算出来π的近似值
- 淘宝主图SKU图采集下载
- 普通话证计算机证英语证,老师的必备证书:教师资格证、普通话证、英语四六级、计算机二级...