跳臺階 & 變態跳臺階

跳臺階:

一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

import time

class Solution:
    def jumpFloor(self, number):
        # 遞歸的方法
        if number == 1:
            return 1
        elif number ==2:
            return 2
        elif number == 3:
            return 3
        return self.jumpFloor(number-2) + self.jumpFloor(number-1)

    def jumpFloor2(self, number):
        # 迭代的方法
        if number <=2:
            return number
        pre1 = 2
        pre2 = 1
        rel = 0
        for i in range(3, number+1):
            rel = pre1 + pre2
            pre2 = pre1
            pre1 = rel
        return rel

t1 = time.time()
A = Solution()
print(A.jumpFloor(20))
t2 = time.time()
tt1 = t2 - t1
print("遞歸的時間:",tt1)


t3 = time.time()
print(A.jumpFloor2(20))
t4 = time.time()
tt2 = t4 - t3
print("迭代的時間:",tt2)

print("\n速度比值爲:",tt1/tt2)
本質上還是斐波那契數列,所以迭代也可以求

當成 dp 問題來想的話:首先分析問題,它最終解是由前面的解累積起來的解,如何縮小問題的規模?

首先可知,第一階有隻能一步,一種;,第二階可以兩次一步、一次兩步兩種

若樓梯階級 n = 3
跳 2 步到 3:剩下的是第一步沒跳,起始跳到第一步只有一種
跳 1 步到 3:剩下的是第二步沒跳,起始跳到第二步有兩種
通過分類討論,問題規模就減少了:

若樓梯階級 n = n
跳 2 步到 n:剩下的是第 n - 2 步沒跳,起始跳到第 n - 2 步設它爲 pre2 種
跳 1 步到 n:剩下的是第 n - 1 步沒跳,起始跳到第 n - 1 步設它爲 pre1 種
同時可以發現第 n 階的解法,只要用到 n - 1 和 n - 2 階是多少,其他的不用考慮,因此用兩個變量臨時存下來即可

dp(i) = dp(i-2) + dp(i-1)
10946
遞歸的時間: 0.002585172653198242   (不建議)
10946
迭代的時間: 1.2874603271484375e-05 

速度比值爲: 200.7962962962963

變態跳臺階

一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

原理:
f(n)=f(n-1)+f(n-2)+……f(1)
f(n-1)=f(n-2)+……f(1)
兩式相減得f(n)=2f(n-1)
class Solution:
    def jumpFloorII(self, number):
        # write code here
        n=1
        for i in range(2,number+1):
            n=2*n
        return n

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章