跳到主要内容

JavaScript 递归

提示
  1. 递归的定义:递归是一种函数自己调用自己的过程。在JavaScript中,递归函数是调用自身的函数。
  2. 递归函数的条件:递归函数必须有一个停止调用自身的条件(基本条件),以防止无限递归。
  3. 递归的应用示例:递归可以用来执行重复的任务,如倒计时或计算数的阶乘。在每次递归调用中,问题的规模减小,直到达到基本条件。

递归是一个函数调用自身的过程。调用自身的函数称为递归函数。

递归函数的语法是:

function recurse() {
// 函数代码
recurse();
// 函数代码
}

recurse();

这里,recurse()函数是一个递归函数。它在函数内部调用自己。

JavaScript中递归的工作原理

一个递归函数必须有条件来停止调用自身。否则,函数将无限期地调用自己。

一旦满足条件,函数停止调用自己。这被称为基本条件(base condition)。

为了防止无限递归,您可以使用if...else语句(或类似方法),其中一个分支进行递归调用,另一个则不进行。

所以,它通常看起来像这样。

function recurse() {
if (condition) {
recurse();
} else {
// 停止调用 recurse()
}
}

recurse();

一个简单的递归函数示例是将值倒数到1。

示例1:打印数字

// 程序倒数数字到1
function countDown(number) {
// 显示数字
console.log(number);

// 减少数字值
const newNumber = number - 1;

// 基本情况
if (newNumber > 0) {
countDown(newNumber);
}
}

countDown(4);

输出

4;
3;
2;
1;

在上述程序中,用户在调用函数时传递一个数字作为参数。

在每次迭代中,数字值减少1,并且函数countDown()被调用,直到数字为正数。这里,newNumber > 0是基本条件。

这个递归调用可以用以下步骤解释:

countDown(4) 打印 4 并调用 countDown(3)
countDown(3) 打印 3 并调用 countDown(2)
countDown(2) 打印 2 并调用 countDown(1)
countDown(1) 打印 1 并调用 countDown(0)

当数字达到0时,满足基本条件,函数不再被调用。

示例2:求阶乘

// 程序找出一个数字的阶乘
function factorial(x) {
// 如果数字是0
if (x === 0) {
return 1;
}

// 如果数字是正数
else {
return x * factorial(x - 1);
}
}

const num = 3;

// 如果 num 是非负数则调用 factorial()
if (num > 0) {
let result = factorial(num);
console.log(`The factorial of ${num} is ${result}`);
}

输出

The factorial of 3 is 6

当您用一个正整数调用factorial()函数时,它会通过递减数字来递归地调用自身。

这个过程一直持续到数字变为1。然后当数字达到0时,返回1

递归函数计算阶乘的工作原理

这个递归调用可以用以下步骤解释:

factorial(3) 返回 3 * factorial(2)
factorial(2) 返回 3 * 2 * factorial(1)
factorial(1) 返回 3 * 2 * 1 * factorial(0)
factorial(0) 返回 3 * 2 * 1 * 1