青蛙跳台阶问题

第十一章 24题

一只青蛙要跳上 n 层高的台阶,一次能跳一级,也可以跳两级,请问这只青蛙有多少种跳上这个 n层高台阶的方法?

思路分析:这个问题有三种方法来解决,并在下面给出三处方法的 python 实现。
方法1:递归

设青蛙跳上 n 级台阶有 f(n)种方法,把这 n 种方法分为两大类,第一种最后一次跳了一级台阶,这类方法共有 f(n-1)种,第二种最后一次跳了两级台阶,这种方法共有 f(n-2)种,则得出递推公式f(n)=f(n-1)+f(n-2),显然,f(1)=1,f(2)=2,递推公式如下:

  • 这种方法虽然代码简单,但效率低,会超出时间上限*
// An highlighted block
def memo(f):
    cache = {}

    def helper(x):
        if x in cache:
            return cache[x]
        cache[x] = f(x)
        return cache[x]
    return helper
@memo

def jumpFloor(n):
    # write code here
    if n == 1:
        return 1
    elif n == 2:
        return 2
    else:
        return jumpFloor(n - 1) + jumpFloor(n - 2)

if __name__ == "__main__":

    print(jumpFloor(99))

方法 2: 用循环来代替递归
这种方法的原理仍然基于上面的公式,但是用循环代替了递归,比上面的代码效率上有较大的提升

代码实现如下:

// An highlighted block
class Solution:
    def climbStairs(self,n):
        if n==1 or n==2:
            return n
        a=1;b=2;c=3
        for i in range(3,n+1):

            c=a+b; a=b; b=c
        return c
if __name__ == '__main__':
    a= Solution()
    print(a.climbStairs(7))

方法3:建立简单数学模型,利用组合数公式

设青蛙跳上这 n 级台阶一共跳了 z 次,其中有 x 次是一次跳了两级,y 次是一次跳了一级,则有z=x+y ,2x+y=n,对一个固定的 x,利用组合可求出跳上这 n 级台阶的方法共有种方法又因为 x 在区
间[0,n/2]内,所以我们只需要遍历这个区间内所有的整数,求出每个 x 对应的组合数累加到最后的结果即可。

// An highlighted block
var foo = 'bar';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值