1. 程式人生 > >爬樓梯(leetcode-70)

爬樓梯(leetcode-70)

需要爬一個n階樓梯來到達樓梯頂部,每次可以爬1階也可以爬2階。求共有多少種爬法?

  1. 遞迴:到達n的“前一步”走法可以是:從n-1處爬1階樓梯,或者從n-2處爬2階樓梯。

    那麼遞迴表示式即寫成return climbStairs(n - 1) + climbStairs(n - 2),遞迴結束條件為n=1或n=2。

  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”那麼肯定是錯誤的。必須從頭走到尾才算一種走法,每一步的選擇只是走法的一部分,而不是一個新的走法。