爬樓梯(leetcode-70)
阿新 • • 發佈:2019-01-05
需要爬一個n階樓梯來到達樓梯頂部,每次可以爬1階也可以爬2階。求共有多少種爬法?
遞迴:到達n的“前一步”走法可以是:從n-1處爬1階樓梯,或者從n-2處爬2階樓梯。
那麼遞迴表示式即寫成
return climbStairs(n - 1) + climbStairs(n - 2)
,遞迴結束條件為n=1或n=2。- 遞迴方法會導致超時,爬樓梯的爬法數目符合斐波那契數列。(為什麼?可參考:爬樓梯與斐波那契數列)
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
a = 1
b = 1
for i in range(n):
a, b = b, a + b
return a
- 為什麼爬樓梯的爬法數目符合斐波那契數列:
設S(n)表示走n級臺階的走法數量。走n級臺階,第一步只有兩種選擇:可以選擇走1階,然後還有S(n-1)種走法;選擇走2階,那麼接下來有S(n-2)種走法。那麼S(n) = S(n-1) + S(n-2)。
糾正不正確的想法:如果你認為“選擇走1階,然後還有S(n-1)種走法,所以總數是S(n-1) + 1”、“選擇走2階,那麼接下來有S(n-2)種走法,所以總數是S(n-2) + 2”那麼肯定是錯誤的。必須從頭走到尾才算一種走法,每一步的選擇只是走法的一部分,而不是一個新的走法。