JavaScript 中的递归是什么

JavaScript 中的递归是什么
最新回答
笑忘书

2026-10-25 11:17:27

递归是函数通过调用自身来解决问题的一种编程技术,尤其适用于可分解为多个相似子问题的情况。其核心在于通过重复调用自身逐步简化问题,直至达到终止条件。以下是递归的关键要素和示例解析:

递归的核心要素
  1. 基本条件(Base Case)

    递归必须有一个明确的终止条件,否则会无限调用导致栈溢出。

    例如:计算阶乘时,0! = 1 是终止条件。

  2. 函数调用(Recursive Call)

    函数在特定条件下调用自身,每次调用应处理更小的子问题。

    例如:fact(n) 调用 fact(n-1)。

  3. 参数调整(Parameter Change)

    每次递归调用需修改参数,使其逐步接近基本条件。

    例如:参数从 n 递减到 0。

示例解析:递归求阶乘代码实现function fact(item) { console.log("function call - ", item); if (item == 0) { // 基本条件 return 1; } return item * fact(item - 1); // 递归调用 + 参数调整}let num = 5;console.log(">> 5 factorial is: ", fact(num));执行流程
  1. 初始调用 fact(5):

    输出 function call - 5,进入 5 * fact(4)。

  2. 递归展开:

    fact(4) → 4 * fact(3)

    fact(3) → 3 * fact(2)

    fact(2) → 2 * fact(1)

    fact(1) → 1 * fact(0)

  3. 触发基本条件:

    fact(0) 返回 1(终止递归)。

  4. 回溯计算:

    fact(1) = 1 * 1 = 1

    fact(2) = 2 * 1 = 2

    fact(3) = 3 * 2 = 6

    fact(4) = 4 * 6 = 24

    fact(5) = 5 * 24 = 120

输出结果function call - 5function call - 4function call - 3function call - 2function call - 1function call - 0>> 5 factorial is: 120递归的优缺点
  • 优点:

    代码简洁,直观表达数学定义(如阶乘、斐波那契数列)。

  • 缺点:

    可能引发栈溢出(如未正确设置基本条件)。

    性能较低(重复函数调用开销大),可用迭代优化。

其他递归示例1. 计数器递归function demo(x) { console.log(x); if (x < 10) { demo(++x); // 参数递增,接近终止条件 x >= 10 }}demo(0); // 输出 0 到 102. 斐波那契数列function fib(n) { if (n <= 1) return n; // 基本条件 return fib(n - 1) + fib(n - 2); // 递归调用}console.log(fib(5)); // 输出 5(0,1,1,2,3,5)总结

递归通过分解问题和自调用简化复杂任务,但需严格定义基本条件和参数变化。理解其执行流程(如阶乘示例中的展开与回溯)是掌握递归的关键。