爬楼梯

递归

最后一步可能是跨了一级台阶,也肯能是两级,所以可以得到: $f(x) = f(x - 1) + f(x -2)$ 公式。

再配合基础的 f(1) = 1f(2) = 2

// 缓存数据,否则容易超时
const map = new Map()

function climbStairs(n: number): number {
  if (n < 1) return 1
  if (n === 1) return 1
  if (n === 2) return 2

  if (map.has(n)) {
    return map.get(n)
  }

  const value = climbStairs(n - 2) + climbStairs(n - 1)
  map.set(n, value)
  return value
}

动态规划

function climbStairs(n: number): number {
  if (n <= 2) return n

  // 初始化状态
  let p = 1, q = 2
  for (let i = 3; i <= n; i++) {
    // 状态转移
    const sum = p + q
    p = q
    q = sum
  }

  return q
}