让我们考虑以下问题。

有一个有N个台阶的楼梯,你一次可以爬1或2个台阶。

给定N,编写一个函数,返回爬完楼梯的方式数量。步骤的顺序很重要。

例如,如果N是4,那么有5种方式:1,1,1,1

2,1,1

1,2,1

1,1,2

2,2

如果规定的不是一次只能爬1或2步,而是可以使用正整数X集合内的任意数字爬楼梯,那会怎么样?例如,如果X = {1,3,5},则表示一次爬升1,3或5阶楼梯。

解决方案

从一些测试案例开始总是好的做法。让我们从小的案例开始,看看能否找到某种规律。N = 1,1种爬楼方式:[1]

N = 2,2种爬楼方式:[1,1],[2]

N = 3,3种爬楼方式:[1,2],[1,1,1],[2,1]

N = 4,5种爬楼方式:[1,1,2],[2,2],[1,2,1],[1,1,1,1],[2,1,1]

你有没有注意到什么?请看N = 3时,爬完3阶楼梯的方法数量是3,基于N = 1和N = 2。存在什么关系?

爬完N = 3的两种方法是首先达到N = 1,然后再往上爬2步,或达到N = 2再向上爬1步。所以 f(3) = f(2) + f(1)。

这对N = 4是否成立呢?是的,这也是成立的。因为我们只能在达到第三个台阶然后再爬一步,或者在到了第二个台阶之后再爬两步这两种方式爬完4个台阶。所以f(4) = f(3) + f(2)。

所以关系如下: f(n) = f(n – 1) + f(n – 2),且f(1) = 1和f(2) = 2。这就是斐波那契数列。def fibonacci(n):

if n <= 1:        return 1

return fibonacci(n - 1) + fibonacci(n - 2)

当然,这很慢(O(2^N))——我们要做很多重复的计算!通过迭代计算,我们可以更快:def fibonacci(n):

a, b = 1, 2

for _ in range(n - 1):

a, b = b, a + b    return a

现在,让我们尝试概括我们学到的东西,看看是否可以应用到从集合X中取步数这个要求下的爬楼梯。类似的推理告诉我们,如果X = {1,3,5},那么我们的算法应该是f(n) = f(n – 1) + f(n – 3) + f(n – 5)。如果n <0,那么我们应该返回0,因为我们不能爬负数。def staircase(n, X):

if n

elif n == 0:        return 1

elif n in X:        return 1 + sum(staircase(n - x, X) for x in X if x

这也很慢(O(|X|^N)),因为也重复计算了。我们可以使用动态编程来加快速度。

每次的输入cache[i]将包含我们可以用集合X到达台阶i的方法的数量。然后,我们将使用与之前相同的递归从零开始构建数组:def staircase(n, X):

cache = [0 for _ in range(n + 1)]

cache[0] = 1

for i in range(n + 1):

cache[i] += sum(cache[i - x] for x in X if i - x > 0)

cache[i] += 1 if i in X else 0

return cache[-1]

现在时间复杂度为O(N * |X|),空间复杂度为O(N)。

欢迎继续探索其他有趣的编程问题。

python爬楼梯算法_Python算法:如何解决楼梯台阶问题相关推荐

  1. python爬楼梯多少种_Python 爬楼梯问题--有n阶台阶,上楼可以一步上1阶,2阶,3阶,计算共有多少种不同的走法?...

    Python爬楼梯问题:有n阶台阶,上楼可以一步上1阶,2阶,3阶,计算共有多少种不同的走法? 总共n步台阶(先假设n>3),f(n)表示n步台阶的走法总数 1.第一步如果是只走1步台阶,剩下的 ...

  2. Python 爬楼梯问题--有n阶台阶,上楼可以一步上1阶,2阶,3阶,计算共有多少种不同的走法?

    Python爬楼梯问题:有n阶台阶,上楼可以一步上1阶,2阶,3阶,计算共有多少种不同的走法? 总共n步台阶(先假设n>3),f(n)表示n步台阶的走法总数 1.第一步如果是只走1步台阶,剩下的 ...

  3. python爬楼梯_Python3爬楼梯算法示例

    Python3爬楼梯算法示例 本文实例讲述了Python3爬楼梯算法.分享给大家供大家参考,具体如下: 假设你正在爬楼梯.需要 n 步你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同 ...

  4. python爬楼梯问题_爬楼梯算法的数学思路

    爬楼梯算法的数学思路 今日腾讯实习面试,问到一题算法. 爬楼梯问题:一个楼梯一共n个台阶,一次上1或者2个台阶.问,一共多少种解法. 这个问题,当时学递归的时候,我记得做过.但是已经一年半没写过递归和 ...

  5. python侯先生爬楼梯_经典算法题:爬楼梯 ,以斐波那契数列来解题代码案例

    网上这题的解题思路主要有两种:动态规划 斐波那契数列 因为我们用斐波那契数列来解,所以我主要描述方法2. 斐波那契数列 又称 兔子数列, 指得是:1.1.2.3.5.8.13.21.--, 在数学上它 ...

  6. python中难的算法_Python算法很难吗?python神书《算法图解》PDF电子版分享给你

    许多小伙伴后台私信说,python算法让自己很头疼,有没有可以让算法像小说一样有趣的书籍资料呢?看这里吧!小宋为大家找到了这本<算法图解>的PDF电子版!让你在学习python的路上变得轻 ...

  7. python分治算法_Python算法:分治法

    本节主要介绍分治法策略,提到了树形问题的平衡性以及基于分治策略的排序算法 本节的标题写全了就是:divide the problem instance, solve subproblems recur ...

  8. 剑指offer有用python版的吗_Python算法面试通关,剑指offer就靠它了

    原标题:Python算法面试通关,剑指offer就靠它了 北上广容不下肉身, 三四线放不下灵魂, 程序员里没有穷人, 有一种土豪叫算法工程师. 算法,晦涩难懂,却又是IT领域最受重视的素养之一可以说, ...

  9. python距离向量路由算法_python算法练习——动态规划与字符串的编辑距离

    动态规划与字符串的编辑距离 动态规划 动态规划(dynamic programming)是解决多阶段决策问题常用的最优化理论,该理论由美国数学家Bellman等人在1957年提出,用于研究多阶段决策过 ...

  10. python编程的50种基础算法_Python算法新手入门大全

    干货:GitHub标星2.6万!Python算法新手入门大全 Python已经成为最受欢迎的程序设计语言之一.自从2004年以后,python的使用率呈线性增长.2011年1月,它被TIOBE编程语言 ...

最新文章

  1. AI每日精选:AI可追踪人体血糖水平;中国或成为首个AI超级大国
  2. 科大星云诗社动态20211008
  3. springboot+thymeleaf+jpa博客多级评论展示案例
  4. echarts 树图样式美化_echarts树图tree改为流程图
  5. java semaphore 等待时间_一个java同步工具类Semaphore的详解
  6. FreeRTOS移植到STM32F103
  7. eclipse添加源码的另外一种方法
  8. 《软件工程》总结——第一章
  9. 修改Linux系统默认编辑器
  10. 2018年1月3日-江苏地税系统无法正常登陆的解决方案
  11. 程序员面试金典——17.5珠玑妙算
  12. CompositeUI Demo BankBranchWorkbench
  13. 数据库设计指南[整理]
  14. Shell script 笔记
  15. 微软小冰迎来了一个新姐妹:“欣小然”
  16. 软件测试人员可以考哪些证书?
  17. 【NLP】一文简要了解词义消歧与实体消歧
  18. Linux 基础资料
  19. 迅雷下载Linux Oracle11gR2和Oracle12c
  20. ab153x-ut apk 洛达1562a蓝牙检测工具 真)

热门文章

  1. word怎样删除向下的箭头“↓”
  2. 使用AltSearch格式化Kindle读书笔记
  3. 超震惊!!微软产品经理每天的工作内容竟然是这个...
  4. Pspice仿真实验 B-3
  5. speedoffice(PPT)插入的表格怎么拆分单元格
  6. tekton pipelineresource资源
  7. 淘宝首页性能优化实践
  8. PS利用色彩范围抠图
  9. 电感的阻抗-频率曲线
  10. 树莓派是什么?能干什么?和单片机有什么区别?