问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法?

解析:从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一步迈2个台阶上来,从第12个台阶上一步迈3个台阶上来),同理,第14个、13个、12个台阶都可以这样推算,从而得到公式f(n) = f(n-1) f(n-2) f(n-3),其中n=15、14、13、...、5、4。然后就是确定这个递归公式的结束条件了,第一个台阶只有1种上法,第二个台阶有2种上法(一步迈2个台阶上去、一步迈1个台阶分两步上去),第三个台阶有4种上法(一步迈3个台阶上去、一步2个台阶 一步1个台阶、一步1个台阶 一步2个台阶、一步迈1个台阶分三步上去)。

有了公式和结束条件,可以使用递推和递归两种方法来解决这个问题,代码如下:

def climbStairs1(n):

#递推法

a = 1

b = 2

c = 4

for i in range(n-3):

c, b, a = a b c, c, b

return c

def climbStairs2(n):

#递归法

first3 = {1:1, 2:2, 3:4}

if n in first3.keys():

return first3[n]

else:

return climbStairs2(n-1) \

climbStairs2(n-2) \

climbStairs2(n-3)

看起来是完美的,不过需要注意的是,上面这个递归算法貌似简洁明了,但效率非常非常低,不仅因为递归时上下文的保存和恢复比较耗时,还因为涉及大量的重复计算。在Python中,可以使用functools标准库提供的缓冲修饰器lru_cache来缓解这个问题。下面的函数和上面的递归函数完全一样,只是在外面加了个缓冲器。

@functools.lru_cache(maxsize=64)

def climbStairs3(n):

#带缓冲的递归法

first3 = {1:1, 2:2, 3:4}

if n in first3.keys():

return first3[n]

else:

return climbStairs3(n-1) \

climbStairs3(n-2) \

climbStairs3(n-3)

下面是测试代码

n = 25

for f in (climbStairs1, climbStairs2, climbStairs3):

start = time.time()

for i in range(1000):

result = f(n)

delta = time.time() - start

print(f.__name__, result, delta)

下面是测试结果,可以看出,普通的递归函数效率非常低,应慎重使用。

climbStairs1 2555757 0.0

climbStairs2 2555757 458.8922302722931

climbStairs3 2555757 0.0

本文转载于微信公众号: Python小屋(Python_xiaowu),更多微信文章请扫描关注公众号:

Tag标签:

python小明爬楼梯_Python两种方法求解登楼梯问题(京东2016笔试题)相关推荐

  1. Python两种方法求解登楼梯问题(京东2016笔试题)

    问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法? 解析:从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一 ...

  2. python 股票数据爬取(两种方法)

    股票HTML网页分析: 东方财富网可以看到股票信息: http://quote.eastmoney.com/stocklist.html 查看源代码: <li><a target=& ...

  3. 百钱买百鸡python编程列表推导式_使用循环和列表推导式两种方法求解百钱买百鸡问题。假设大鸡5元一只,中鸡3元一只,小鸡1元三只,现有100元钱想买100只鸡,有多少种买法?...

    [程序题]编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 1/1+1/3+...+1/n [单选题]患者男,67岁.确诊为原发性支气管肺癌,为行手术 ...

  4. 5.4 一家人才测评机构低随机抽取的10名小企业的经理人用两种方法进行自信心测试,得到的自信心测试分数如下

    2022-11-29 5.4 一家人才测评机构低随机抽取的10名小企业的经理人用两种方法进行自信心测试,得到的自信心测试分数如下 人员编号 方法1 方法2 1 78 71 2 63 44 3 72 6 ...

  5. yii2 php 生成小程序分享海报的两种方法

    前段时间做了个小程序-爱小环保,现在要给它加一个生成海报分享朋友圈的功能. 先简单介绍下这个小程序,主要是号召大家随手捡垃圾,如果你在马路上见到别人随手丢的垃圾,可以将它拍下来,然后丢到垃圾桶,拍下来 ...

  6. python 修改文件创建时间_python 两种方法修改文件的创建时间、修改时间、访问时间...

    突如其来想知道一下 python 如何修改文件的属性(创建.修改.访问时间),于是就去网上搜集了可行方案,也就有了这篇博客 方案一 from win32file import CreateFile, ...

  7. python删除空文件和文件夹_python 两种方法删除空文件夹

    第一种方法: import os def delete_gap_dir(dir): if os.path.isdir(dir): for d in os.listdir(dir): #print(&q ...

  8. Python数据分析:异常值检验的两种方法 -- Z 分数 上下分位点(放入自写库,一行代码快速实现)

    本文已在公众号 " 数据分析与商业实践 " 首发.关注一下~,更多商业数据分析案例源码等你来撩.后台回复 "异常值" ,即可获取本文的案例示范与包含详细注释的源 ...

  9. python hist直方图拟合曲线_详解用Python为直方图绘制拟合曲线的两种方法

    直方图是用于展示数据的分组分布状态的一种图形,用矩形的宽度和高度表示频数分布,通过直方图,用户可以很直观的看出数据分布的形状.中心位置以及数据的离散程度等. 在python中一般采用matplotli ...

  10. 微信小程序开发流程的两种方法科普

    现在微信小程序早已渗透我们日常生活的方方面面,很多商家看到了小程序带来的巨大流量,也想开发一个自己的小程序.所以今天就跟大家科普下微信小程序开发流程,你会发现这个开发过程其实非常简单. 1. 在微信公 ...

最新文章

  1. 输入一个数寻找丑数C语言,数据结构与算法试题80道.doc
  2. PyQt5 技巧篇-增加一个类级变量,类级变量的设置方法,类级“常量“设置方法
  3. linux select read阻塞_linux下的IO模型详解
  4. 【跃迁之路】【593天】程序员高效学习方法论探索系列(实验阶段350-2018.09.21)...
  5. java jtextarea 显示_Java开发网
  6. 病毒周报(100125至100131)
  7. Ubuntu 配置Samba 服务器
  8. 抓包工具Fiddler的使用说明
  9. Linux crontab 定时任务详解
  10. java中的线程方面的面试题_Java线程类相关面试题与答案总结
  11. 窗体程序计算一元二次方程
  12. 怎么将两个PDF合并成一个?这里有三个小妙招分享给你
  13. shell的正向和反向
  14. macbook pro进水紧急处理方案以及维修建议
  15. 【测试用例练习】八、淘宝网站测试用例
  16. KaTex数学公式编辑器相关
  17. RocketMQ 5.0 本地源码启动Cluster模式指南
  18. java实现 GeoHash 算法(GeoHash位数与距离对应关系)
  19. python中exec的用法_如何在Python中安全地使用exec()?
  20. 软件工程 第一周阅读作业

热门文章

  1. 纸张的规格A3.A4.A5.A6纸的尺寸大小
  2. html简单登录页面代码
  3. 作为一个面试官如何准备一场面试
  4. 中兴新支点操作系统_中兴新支点国产操作系统体验报告:使用流畅,性能稳定!...
  5. 看_那人好像一个产品狗_对_这就是产品狗
  6. 穿越东西冲、感受户外、爱上运动
  7. 网络嗅探与身份认证-实验二
  8. PS利用色彩范围抠图
  9. python给批量图片添加文字 脚本_Python实现图片添加文字
  10. 手机OTG 我的世界_关于旧安卓手机改用为门禁探头、监控摄像头方案