楼梯台阶

问题描述:

一个共有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]]


问题出处:http://www.cheemoedu.com/exercise/29

转载于:https://my.oschina.net/jmbzs/blog/714675

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值