Python递归实现爬楼梯问题

2023-04-15 00:00:00 python 递归 爬楼梯

爬楼梯问题是经典的动态规划问题,但也可以用递归解决。假设一共有n个台阶,可以一次爬1个或2个,那么到达第n个台阶的方法数就等于到达第n-1个和第n-2个台阶的方法数之和。因此,我们可以写出递归代码:

def climbStairs(n: int) -> int:
    if n == 0 or n == 1:
        return 1
    return climbStairs(n-1) + climbStairs(n-2)

这个递归函数接收一个整数n,表示台阶数,返回一个整数,表示到达第n个台阶的方法数。我们首先处理特殊情况:当台阶数为0或1时,只有一种到达方法,直接返回1。否则,返回到达第n-1个和第n-2个台阶的方法数之和。

不过,这个递归函数的时间复杂度为指数级,因为对于某些台阶数,我们会重复计算其子问题。例如,当n=4时,climbStairs(3)和climbStairs(2)会被分别计算两次,因此我们需要想办法优化。

一种优化方法是使用记忆化搜索,即在递归过程中记录已经计算过的子问题的结果,避免重复计算。可以使用一个列表memo来存储,memo[i]表示到达第i个台阶的方法数。如果memo[i]不为None,说明已经计算过,直接返回memo[i]即可;否则,进行递归计算,并将结果存入memo[i]中。

def climbStairs(n: int) -> int:
    memo = [None] * (n+1)
    return helper(n, memo)

def helper(n: int, memo: List[int]) -> int:
    if n == 0 or n == 1:
        return 1
    if memo[n] is not None:
        return memo[n]
    memo[n] = helper(n-1, memo) + helper(n-2, memo)
    return memo[n]

另一种优化方法是使用迭代,即从小到大计算每个子问题,避免重复计算。可以用两个变量a和b来分别记录到达第i和第i+1个台阶的方法数,然后迭代n-2次,每次用a+b更新a和b的值。

def climbStairs(n: int) -> int:
    if n == 0 or n == 1:
        return 1
    a, b = 1, 1
    for i in range(2, n+1):
        c = a + b
        a, b = b, c
    return b

这个迭代函数的时间复杂度为O(n),空间复杂度为O(1)。用递归实现的话,时间复杂度为O(2^n),空间复杂度为O(n)(递归栈的深度)。

相关文章