青蛙跳台阶问题(一)

题目描述

一只青蛙一次可以跳上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取更大的数值时我们的等待时间。

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

扫描二维码关注公众号,回复: 4491359 查看本文章
# 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

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

猜你喜欢

转载自blog.csdn.net/noingw96/article/details/84525458