请用 JavaScript 编写实现斐波那契数列的具体代码,并说明实现方式。
考察说明
考查候选人用 JavaScript 实现经典数列的编码能力及对递归、迭代等方法的理解。
回答思路
- 【回答框架 1】斐波那契数列定义为 F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)。常见实现有递归、带记忆化递归、迭代和动态规划。
- 【回答框架 2】递归实现最直观:function fib(n){ if(n<=1) return n; return fib(n-1)+fib(n-2); },但时间复杂度为 O(2^n),n 较大时性能差。
- 【回答框架 3】迭代实现更高效:function fib(n){ let a=0,b=1; for(let i=2;i<=n;i++){ let temp=a+b; a=b; b=temp; } return n<=1?n:b; },时间复杂度 O(n),空间复杂度 O(1)。
- 【回答框架 4】也可用数组动态规划:let dp=[0,1]; for(let i=2;i<=n;i++) dp[i]=dp[i-1]+dp[i-2]; return dp[n];,空间 O(n)。
- 【回答框架 5】实际面试中建议先给出递归,再优化为迭代或记忆化,体现对性能的考虑。
- 【关键点 1】递归实现简洁但指数级复杂度,迭代实现 O(n) 时间和 O(1) 空间。
- 【关键点 2】记忆化递归可优化到 O(n) 时间。
- 【关键点 3】注意 n=0 和 n=1 的边界返回。
- 【关键点 4】代码需处理输入合法性,如非负整数。
- 【关键点 5】面试中展示从递归到迭代的优化过程更佳。
- 【易错点 1】直接使用递归不优化,n 较大时栈溢出或超时。
- 【易错点 2】忽略 n 为 0 或 1 的边界条件。
- 【易错点 3】未考虑输入为负数或非整数的情况。