1. 程式人生 > >青蛙跳臺階問題(一)

青蛙跳臺階問題(一)

題目描述

一隻青蛙一次可以跳上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

我們同樣可以對程式的執行時間進行測試,顯然這個時間才是一個程式的正常等待時間。