python⼩明爬楼梯_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入门教程Python实现
1.递推法
1 def climbStairs1(n):
2 a = 1
href在html是什么意思
3 b = 2
4 c = 4
5 for i in range(n-3):
6 c, b, a = a+b+c, c, b
7 return c
2.递归法
sql 2016入门新手教程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():
springmvc
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;
linux删除一类文件for(int i=0;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