Skip to content

递归

递归:函数会调用自身。

递归是一种编程模式。

递归思维方式会使代码更简单,更容易维护。

例:计算 n 的 x 次方

使用循环

js
const pow = (n, x) => {
  let result = 1;

  for (let i = 1; i <= x; i++) {
    result = result * n;
  }

  return result;
};

使用递归

js
const pow = (n, x) => {
  if (x <= 1) return n;

  return n * pow(n, x - 1);
};

或者更简洁

js
const pow = (n, x) => (x === 1 ? x : n * pow(n, x - 1));

最大的嵌套调用次数被称为 递归深度。

最大递归深度受限于 JavaScript 引擎。

引擎在最大迭代深度为 10000 及以下时是可靠的 。

递归 与 循环

因为递归会产生新的 执行上下文,所以递归会更占内存。

任何递归都可以用循环来重写。

但是 递归可以使代码更短,更易于理解和维护。

大多数时候我们需要一个好代码。

递归结构

todos

js
let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null,
      },
    },
  },
};

数组是有序集合,在头部或者中间 插入删除 数据的代价都很大。

通过递归结构产生的 链表元素,就没有这个问题。可以为所欲为。