js实现递归
递归的基本概念
递归是一种通过函数调用自身来解决问题的方法。在JavaScript中,递归函数需要包含两个部分:基线条件(递归终止条件)和递归条件(调用自身的条件)。
实现递归的步骤
定义一个递归函数时,明确基线条件至关重要,否则可能导致无限循环。例如,计算阶乘的递归实现:
function factorial(n) {
if (n === 0) { // 基线条件
return 1;
}
return n * factorial(n - 1); // 递归条件
}
递归的经典案例
斐波那契数列是另一个常见案例。递归实现如下:

function fibonacci(n) {
if (n <= 1) { // 基线条件
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2); // 递归条件
}
尾递归优化
JavaScript引擎(如V8)支持尾调用优化(TCO),可减少递归的堆栈消耗。尾递归形式的阶乘函数:
function factorialTail(n, acc = 1) {
if (n === 0) {
return acc;
}
return factorialTail(n - 1, acc * n);
}
递归的注意事项
递归可能导致堆栈溢出,尤其是处理大规模数据时。可通过以下方式规避:

- 使用尾递归(需引擎支持)
- 改用迭代(循环)实现
- 限制递归深度
递归与迭代的对比
递归代码通常更简洁,但性能可能不如迭代。例如,阶乘的迭代实现:
function factorialIterative(n) {
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
递归的实际应用
递归适用于树形结构操作、分治算法等场景。例如,遍历DOM树:
function traverseDOM(node, callback) {
callback(node);
node = node.firstChild;
while (node) {
traverseDOM(node, callback);
node = node.nextSibling;
}
}






