【问题标题】:How do recursions continue calling after a return递归如何在返回后继续调用
【发布时间】:2022-11-20 01:50:48
【问题描述】:

我正在尝试弄清楚这个功能是如何运作的,

function mergeSort(a) {
  if (a.length === 1) return a;
  const mid = Math.trunc(a.length / 2);
  const left = mergeSort(a.slice(0, mid));
  const right = mergeSort(a.slice(mid));
  const result = [];

  ((l, r) => {
    let i = 0,
      j = 0;

    while (i < l.length && j < r.length) {
      l[i] < r[j] ? result.push(l[i++]) : result.push(r[j++]);
    }
    while (i < l.length) result.push(l[i++]);
    while (j < r.length) result.push(r[j++]);
  })(left, right);

  return result;
}

const random = [10, 5, 2, 7, 3, 4];

我不明白是什么在记忆中保留了左侧/右侧。

在第一次迭代中,立即调用函数表达式 (IIFE) 具有参数 [5,2],因为返回了 [1]。然后它对 [5,2] 进行排序。那么为什么 IIFE 再次运行排序左[10],右[2,5]?是什么导致了这个动作?

【问题讨论】:

  • 您是否使用调试器来跟踪执行?如果不是,为什么不呢?
  • 函数的哪一部分让您感到困惑?检查合并排序可视化可能是个好主意。它使理解递归算法变得更容易。

标签: javascript


【解决方案1】:

我不明白是什么在记忆中保留了左侧/右侧

左侧/右侧保存在每个函数调用的leftright 变量中。由于变量是函数范围的,这意味着每个调用都可以有自己的 leftright 版本

归并排序是“分而治之”方法的典型例子。输入数组通过递归被分成越来越小的部分。递归发生,直到我们剩下 1 个元素单元。
之后,只需在退出递归的过程中合并 2 个排序数组即可。

有非常简洁的网站展示算法的可视化。看看at this website here

编辑:正如Dai 在他的评论中提到的那样。尝试通过调试器运行此代码。它会让您更好地了解您的代码是如何逐行运行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多