假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
记忆递归
class Solution(object):
def climbStairs(self, n):
# """
# :type n: int
# :rtype: int
# """
# if n ==0 or n ==1:
# return 1
# return self.climbStairs(n-1)+self.climbStairs(n-2)
# 记忆化递归
def dfs(i, memo):
if i==0 or i ==1:
return 1
if memo[i] == -1:
memo[i] = dfs(i-1, memo)+dfs(i-2,memo)
return memo[i]
return dfs(n, [-1]*(n+1))
solution = Solution()
n = solution.climbStairs(8)
print(n)
climbStairs函数是外部调用的接口,传入参数n表示楼梯的阶数。这个函数内部定义了一个嵌套函数dfs来执行递归。dfs函数是一个递归函数,用于计算爬到第i阶楼梯的方式数量。递归的基本情况是当i等于 0 或 1 时,只有一种爬法,即不爬或者爬一阶。如果memo[i]不等于 -1,说明已经计算过,直接返回保存的结果;否则,计算dfs(i - 1, memo) + dfs(i - 2, memo),即爬到当前阶数的方式数量,并将结果保存在memo[i]中。- 在
climbStairs函数内部,初始化一个长度为n + 1的数组memo,用于保存计算结果。初始时,数组的每个元素都设置为 -1,表示尚未计算。然后调用dfs(n, memo),从顶层开始计算爬到第n阶楼梯的方式数量。
动态规划
def climbStairs(self, n: int) -> int:
dp = [0] * (n + 1)
dp[0] = dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[-1]
dp是一个长度为n + 1的数组,用于保存到达每个阶梯的方式数量。数组的索引表示阶梯的编号,数组的值表示到达该阶梯的方式数量。- 初始化
dp[0]和dp[1]分别为 1,因为到达第 0 阶和第 1 阶的方式只有一种,就是不走或者走一步。 - 使用循环从第 2 阶开始,依次计算到达每个阶梯的方式数量。对于每个阶梯
i,它的方式数量等于前两个阶梯的方式数量之和,即dp[i] = dp[i - 1] + dp[i - 2]。 - 最终返回
dp[-1],即到达第n阶的方式数量。