问题描述:
一个共有10个台阶的楼梯,从下面走到上面,一次只能迈一个台阶或两个台阶,并且不能后退,走完这个楼梯共有多少种方法。
我的代码:
def lt(n):
if n==1:
return 1
elif n==2:
return 2
else:
return lt(n-2)+lt(n-1)
print lt(10)
结果:
89
思路:
借鉴了这篇文章:http://www.lxway.com/522841804.htm
刚开始做的时候,想了传统的方法,可是想到最后觉得一昧求的话太麻烦了,而且太难实现了,网上搜了一下才知道这是典型的递归问题,整个人就豁然开朗了;而且这次不是从下向上递归,而是上往下递归的,即最后是一步上1个台阶的话,之前上了n-1个台阶,走法为f(n-1)种,而最后是一步上2个台阶的话,之前上了n-2个台阶,走法为f(n-2)种,故而f(n)=f(n-1)+f(n-2)
示例代码(修改后):
def fun(n):
res = fun.cache.get(n, None)
if res:
return res
res = []
for step in (1, 2):
if n < step: break
for p in fun(n - step):
res.append([step] + p)
fun.cache[n] = res
return res
fun.cache = {0:[[]]}
print len(fun(10))
print fun(10)
结果:
89
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 1, 2, 1], [1, 1, 1, 1, 1, 1, 2, 1, 1],
[1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 2, 1, 1, 1], [1, 1, 1, 1, 1, 2, 1, 2], [1, 1, 1, 1, 1, 2, 2, 1],
[1, 1, 1, 1, 2, 1, 1, 1, 1], [1, 1, 1, 1, 2, 1, 1, 2], [1, 1, 1, 1, 2, 1, 2, 1], [1, 1, 1, 1, 2, 2, 1, 1],
[1, 1, 1, 1, 2, 2, 2], [1, 1, 1, 2, 1, 1, 1, 1, 1], [1, 1, 1, 2, 1, 1, 1, 2], [1, 1, 1, 2, 1, 1, 2, 1],
[1, 1, 1, 2, 1, 2, 1, 1], [1, 1, 1, 2, 1, 2, 2], [1, 1, 1, 2, 2, 1, 1, 1], [1, 1, 1, 2, 2, 1, 2], [1, 1, 1, 2, 2, 2, 1],
[1, 1, 2, 1, 1, 1, 1, 1, 1], [1, 1, 2, 1, 1, 1, 1, 2], [1, 1, 2, 1, 1, 1, 2, 1], [1, 1, 2, 1, 1, 2, 1, 1],
[1, 1, 2, 1, 1, 2, 2], [1, 1, 2, 1, 2, 1, 1, 1], [1, 1, 2, 1, 2, 1, 2], [1, 1, 2, 1, 2, 2, 1], [1, 1, 2, 2, 1, 1, 1, 1],
[1, 1, 2, 2, 1, 1, 2], [1, 1, 2, 2, 1, 2, 1], [1, 1, 2, 2, 2, 1, 1], [1, 1, 2, 2, 2, 2], [1, 2, 1, 1, 1, 1, 1, 1, 1],
[1, 2, 1, 1, 1, 1, 1, 2], [1, 2, 1, 1, 1, 1, 2, 1], [1, 2, 1, 1, 1, 2, 1, 1], [1, 2, 1, 1, 1, 2, 2],
[1, 2, 1, 1, 2, 1, 1, 1], [1, 2, 1, 1, 2, 1, 2], [1, 2, 1, 1, 2, 2, 1], [1, 2, 1, 2, 1, 1, 1, 1], [1, 2, 1, 2, 1, 1, 2],
[1, 2, 1, 2, 1, 2, 1], [1, 2, 1, 2, 2, 1, 1], [1, 2, 1, 2, 2, 2], [1, 2, 2, 1, 1, 1, 1, 1], [1, 2, 2, 1, 1, 1, 2],
[1, 2, 2, 1, 1, 2, 1], [1, 2, 2, 1, 2, 1, 1], [1, 2, 2, 1, 2, 2], [1, 2, 2, 2, 1, 1, 1], [1, 2, 2, 2, 1, 2],
[1, 2, 2, 2, 2, 1], [2, 1, 1, 1, 1, 1, 1, 1, 1], [2, 1, 1, 1, 1, 1, 1, 2], [2, 1, 1, 1, 1, 1, 2, 1],
[2, 1, 1, 1, 1, 2, 1, 1], [2, 1, 1, 1, 1, 2, 2], [2, 1, 1, 1, 2, 1, 1, 1], [2, 1, 1, 1, 2, 1, 2], [2, 1, 1, 1, 2, 2, 1],
[2, 1, 1, 2, 1, 1, 1, 1], [2, 1, 1, 2, 1, 1, 2], [2, 1, 1, 2, 1, 2, 1], [2, 1, 1, 2, 2, 1, 1], [2, 1, 1, 2, 2, 2],
[2, 1, 2, 1, 1, 1, 1, 1], [2, 1, 2, 1, 1, 1, 2], [2, 1, 2, 1, 1, 2, 1], [2, 1, 2, 1, 2, 1, 1], [2, 1, 2, 1, 2, 2],
[2, 1, 2, 2, 1, 1, 1], [2, 1, 2, 2, 1, 2], [2, 1, 2, 2, 2, 1], [2, 2, 1, 1, 1, 1, 1, 1], [2, 2, 1, 1, 1, 1, 2],
[2, 2, 1, 1, 1, 2, 1], [2, 2, 1, 1, 2, 1, 1], [2, 2, 1, 1, 2, 2], [2, 2, 1, 2, 1, 1, 1], [2, 2, 1, 2, 1, 2],
[2, 2, 1, 2, 2, 1], [2, 2, 2, 1, 1, 1, 1], [2, 2, 2, 1, 1, 2], [2, 2, 2, 1, 2, 1], [2, 2, 2, 2, 1, 1], [2, 2, 2, 2, 2]]