斐波那契

斐波那契数列的多种实现方式,从递归到迭代到动态规划。

#tech / dev / frontend #type / concept #status / growing #resource / algorithm #algo / recursion #algo / dp

[!info] related notes

斐波那契

这篇笔记回答一个问题:斐波那契数列有哪些实现方式,以及面试中哪种最稳。

题目

斐波那契数列定义为 F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2)(n >= 2)。求 F(n)。

实现方式

1. 纯递归(不推荐)

function fib(n) {
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
}

时间复杂度 O(2^n),大量重复计算,面试直接说”会超时”。

2. 记忆化递归

function fib(n, memo = {}) {
  if (n <= 1) return n;
  if (memo[n]) return memo[n];
  memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
  return memo[n];
}

时间复杂度 O(n),空间复杂度 O(n)。

3. 迭代(面试推荐)

function fib(n) {
  if (n <= 1) return n;
  let a = 0, b = 1;
  for (let i = 2; i <= n; i++) {
    [a, b] = [b, a + b];
  }
  return b;
}

时间复杂度 O(n),空间复杂度 O(1)。面试最稳的写法。

4. 动态规划

function fib(n) {
  if (n <= 1) return n;
  const dp = [0, 1];
  for (let i = 2; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2];
  }
  return dp[n];
}

时间复杂度 O(n),空间复杂度 O(n)。可以优化为 O(1) 空间。

常见边界

  • n = 0 返回 0
  • n = 1 返回 1
  • n 很大时注意整数溢出(JS 中 Number.MAX_SAFE_INTEGER 是 2^53 - 1,fib(78) 就超了)

最小例子

fib(0);  // 0
fib(1);  // 1
fib(2);  // 1
fib(3);  // 2
fib(10); // 55
创建于 2026/4/3 更新于 2026/5/27