斐波拉契数列是什么,用 JS 实现,用尾调优化斐波拉契数列
斐波那契数列(Fibonacci Sequence)是一种经典的数列,每个数都是前两个数的和。通常的数列从 0 和 1 开始,数列的定义如下:
- ( F(0) = 0 )
- ( F(1) = 1 )
- 对于 ( n > 1 ),( F(n) = F(n-1) + F(n-2) )
JavaScript 实现
斐波那契数列可以用递归方法、迭代方法或尾调用优化方法来实现。尾调用优化(Tail Call Optimization, TCO)是一种优化技术,允许编译器在函数的最后一步调用另一个函数时,重用当前函数的栈帧,从而避免栈溢出。
1. 基本递归实现(不优化)
javascript
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacci(10)); // 输出: 552. 尾调用优化实现
尾调用优化需要确保递归调用是函数的最后一步。下面是尾调用优化的斐波那契数列实现:
javascript
function fibonacci(n) {
function tailRecursiveFib(n, a = 0, b = 1) {
if (n === 0) return a;
if (n === 1) return b;
return tailRecursiveFib(n - 1, b, a + b);
}
return tailRecursiveFib(n);
}
console.log(fibonacci(10)); // 输出: 55解释
尾递归函数
tailRecursiveFib:- 该函数接收三个参数:
n(剩余的步骤)、a(当前的斐波那契数)和b(下一个斐波那契数)。 - 如果
n为 0,返回a,否则,如果n为 1,返回b。 - 否则,递归调用
tailRecursiveFib,将n-1作为新的步骤,b作为当前的斐波那契数,a + b作为下一个斐波那契数。
- 该函数接收三个参数:
尾调用优化:
- 在递归调用中,
tailRecursiveFib是函数的最后一步调用,因此可以进行尾调用优化,避免了传统递归中的栈深度问题。
- 在递归调用中,
题目要点:
- 斐波那契数列:每个数是前两个数的和,常见的递归和迭代实现方式。
- 尾调用优化:通过尾递归实现可以提高性能和避免栈溢出问题,特别是在处理大规模的递归调用时。
尾调用优化在某些 JavaScript 引擎中可能不被完全支持,但良好的编程实践是尽量使用尾递归来避免性能瓶颈。