Python求解登楼梯问题(京东2016笔试题)
问题:假设一段楼梯共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种上法。
Python实现
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
2.递归法
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)
看起来,问题似乎解决了。但是再多考虑一点,方法2中使用递归效率非常低,不仅因为递归时上下文的保存和恢复比较耗时,还因为涉及大量的重复计算。
因此进一步改进,可使用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)
Java实现
1.递推法
public static int climbStairs1(int n){
        int a = 1;
        int b = 2;
        int c = 4;
        for(int i=0;i<n-3;i++){
            c = a + b + c;
            b = c - a - b;
            a = c - b - a;
        }
        return c;
    }
2.递归法
public static int climbStairs2(int n){
        int first[] = new int[3];
        first[0] = 1;
        first[1] = 2;
        first[2] = 4;
        if(n<=3){
            return first[n-1];
        }
        else{
            return climbStairs2(n-1) + climbStairs2(n-2) + climbStairs2(n-3);
        }
    }
参考资料:微信号:Python_xiaowu
Python求解登楼梯问题(京东2016笔试题)的更多相关文章
- 剑指Offer——京东实习笔试题汇总
		剑指Offer--京东实习笔试题汇总 编程题1 题目的详细信息已经记不住,只能大致描述一下,就是求最有价值的的委托信息. n.s.B.S其中n代表委托信息,s要求的最有价值的委托信息的个数,B代表买入 ... 
- 剑指Offer——京东校招笔试题+知识点总结
		剑指Offer--京东校招笔试题+知识点总结 笔试感言 经过一系列的笔试,发觉自己的基础知识还是比较薄弱的,尤其是数据结构和网络,还有操作系统.工作量还是很大的.做到精确制导的好方法就是在网上刷题,包 ... 
- Python求解啤酒问题(携程2016笔试题)
		问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升.32升.36升.38升.40升和62升,并且只卖整桶酒,不零卖.第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的 ... 
- python实现单链表反转(经典笔试题)
		https://blog.csdn.net/su_bao/article/details/81072849 0.说在前面的话 链表结构,说难不难,说易不易,一定要亲自编程实现一下.其次就是一定要耐心, ... 
- python web的一些常见技术面试笔试题
		1. 三次握手四次挥手 tcp建立连接的过程是三次挥手,断开连接是4次挥手. 三次握手:建立连接时 a. 客户端发送syn=1 seq=k给服务器 b. 服务器接收到之后知道有客户端想建立连接, ... 
- C  2016笔试题
		1.下面程序的输出结果是( ) int x = 3; do { printf(“%d\n”,x -= 2); }while(!(-- x)); 分析:x初始值为3,第一次循环中运行printf函 ... 
- 阿里巴巴集团2016校园招聘-Python工程师笔试题(附加题+部分答案)
		前言 第一次网上笔试,被虐的很惨.一是不太习惯,最主要的是还是自己对Python的掌握,还不够熟练.下面是这次阿里笔试相关信息 笔试时间是,2015年8月23日,10:00——12:00 对于笔试题, ... 
- Python求解进制问题(阿里巴巴2015笔试题)
		问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来 ... 
- 华为2018软件岗笔试题之第一题python求解分享
		闲来无事,突然看到博客园首页上有人写了篇了华为2018软件岗笔试题解题思路和源代码分享.看了下题目,感觉第一题能做出来,就想着用刚刚学的python试着写一下,花费的时间有点长~~,看来又好长时间没练 ... 
随机推荐
- IOS开发中UITableView(表视图)的滚动优化及自定义Cell
			IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITable ... 
- IOS开发-UI学习-NSMutableAttributedString(带属性的字符串)的使用
			带属性的字符串: NSString *aa = @"hellochinaIloveYou!"; NSMutableAttributedString *mas = [[NSMutab ... 
- MySQL常用命令(参考资料,部分改动)
			一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 . 连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ... 
- [Angular Tutorial] 1-Static Template
			为了说明Angular如何扩展了标准的html,您将会创建了一个纯粹的静态html页面,并且看到我们如何将这些html代码转换成Angular能动态展示相同结果的模板. 在这一步您将会在一个html页 ... 
- spark RDD编程,scala版本
			1.RDD介绍: RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ... 
- php 中 php-fpm 的重启、终止操作命令
			php-fpm没有启动nginx会报502的错误 php 5.3.3 下的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|s ... 
- 最简化模型2——css3分阶段动画效果(经过实测)之转动的div
			@keyframes mymove{ 0%{top: 0;left: 0;transform:rotate(50deg);} 10%{top: 100px;left: 50px;trans ... 
- iOS 之 Block Variable
			在某个变量前面加__block ,这个变量就变成了block variable.那么就可以在block里面修改该值. 
- linux iptables 配置
			1.查看已有配置 iptables -L -n 2.清除原有规则. iptables -F 清除预设表filter中的所有规则链的规则 iptables -X 清除预设表f ... 
- --@angularJS--较复杂的指令嵌套demo——综合小实例:登陆界面
			1.index.html: <!DOCTYPE HTML><html ng-app="app"><head> <title>c ... 
