递归

函数调用自身,即递归,用于解决包含更小子问题的更宏观的问题。递归函数可以接收两个输入:基本情况(结束递归)或递归情况(继续递归)。

示例

递归函数调用自身,直到满足条件

下面的 Python 代码定义了一个函数,该函数接收一个数字,打印该数字,然后用该数字减 1 来再次调用自身。它会一直进行下去,直到数字等于 0,这时它会停止。

python
def recurse(x):
   if x > 0:
       print(x)
       recurse(x - 1)

recurse(10)

输出将如下所示

10
9
8
7
6
5
4
3
2
1

递归受堆栈大小限制

以下代码定义了一个函数,该函数返回代码运行的 JavaScript 运行时中可用的调用堆栈的最大大小。

js
const getMaxCallStackSize = (i) => {
  try {
    return getMaxCallStackSize(++i);
  } catch {
    return i;
  }
};

console.log(getMaxCallStackSize(0));

常见用法示例

js
const factorial = (n) => {
  if (n === 0) {
    return 1;
  }
  return n * factorial(n - 1);
};
console.log(factorial(10));
// 3628800
js
const fibonacci = (n) => (n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2));
console.log(fibonacci(10));
// 55
js
const reduce = (fn, acc, [cur, ...rest]) =>
  cur === undefined ? acc : reduce(fn, fn(acc, cur), rest);
console.log(reduce((a, b) => a + b, 0, [1, 2, 3, 4, 5, 6, 7, 8, 9]));
// 45

另见