青蛙跳臺階問題(一)
阿新 • • 發佈:2018-12-13
題目描述
一隻青蛙一次可以跳上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
我們同樣可以對程式的執行時間進行測試,顯然這個時間才是一個程式的正常等待時間。