需要爬一个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”那么肯定是错误的。必须从头走到尾才算一种走法,每一步的选择只是走法的一部分,而不是一个新的走法。