青蛙跳台阶问题(一)

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)?

解题思路

第一步,我们确定每一次上台阶只有两种选择,跳一阶或者两阶。

第二步,我们走完第一步时可能已经跳了一阶或者两阶,因此剩下的台阶是n-1或者n-2阶。

第三步,设剩下的n-1阶有m1种跳法,剩下的n-2阶有m2种跳法,则n阶台阶的跳法有m1+m2种。

经过上述问题,我们就将一个n阶的问题化成了比n小阶的问题,利用的就是分治的思想,实现的代码也比较简单。

# coding:utf-8
def jumpFloor(number):
    if number==0:#跳的台阶为0的情况
        return 0
    else:
        return jump(number)
def jump(number):
    if number==0:
        return 1
    if number==1:
        return 1
    if number>1:
        m1=jump(number-1)
        m2=jump(number-2)
    return m1+m2
if __name__=="__main__":
    n=10
    s=jumpFloor(n)
    print s

当我们使用这个方法解决n较小的问题时还是可行的,如果n比较大的时候,由于大量的递归运算,我们的时间和空间成本都是极大的。在这里我做了一个测试,对程序的运行时间进行计算。

当n=20的时候,运行时间还是可以接受的。

当我们取n=35时,这个运行时间我们就难以接受了,难以想象n取更大的数值时我们的等待时间。

我们在这里介绍第二种方法,利用动态规划法的思想将已经计算的子问题使用数组进行保存。其实细心的朋友应该发现了,这一道问题就是我们常说的斐波拉契数列的实际应用。

# coding:utf-8
def jumpFloor(number):
    if number==0:
        return 0
    if number==1:
        return 1
    if number==2:
        return 2
    a = [1,2]
    for i in range(2,n):
        a.append(a[i-1]+a[i-2])
    return a[i]
if __name__=="__main__":
    n=10
    s=jumpFloor(n)
    print s

我们同样可以对程序的运行时间进行测试,显然这个时间才是一个程序的正常等待时间。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值