对于通过闭包共享引用的递归调用,按引用传递和按数组值传递有什么区别?

What is the difference between passing by reference and passing by value of arrays for recursive calls which share a reference via a closure?

提问人:Leo C. 提问时间:1/19/2022 更新时间:1/19/2022 访问量:50

问:

我正在研究以下提示的解决方案:给定一个不同整数的数组,返回所有可能的排列。您可以按任何顺序返回答案。

以下代码通过测试:

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
const permute = function(nums) {
  const results = [];
  const backtrack = (first = 0) => {
    if (first === nums.length) {
      results.push([...nums]);
      return
    }
    for (let i = first; i < nums.length; i++) {
      nums = swap(nums, first, i);
      backtrack(first + 1);
      nums = swap(nums, first, i)
    }
  }
  backtrack()
  return results
};

const swap = (arr, i, j) => {
  const temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
  return arr;
}

考虑一个计算排列的示例,其中 .nums = [1, 2, 3]

当我尝试传入而不是 时,我的理解差距是显而易见的,它返回适当长度的结果数组,但在每个索引处都用数组填充。为什么有必要在这里做一个浅拷贝,而不是直接推送?我的理解是,在递归调用中满足基本情况的点上,将是什么当前的排列。在存储我们的排列之后,我们回溯/取消交换并继续。我想一定是这样,数组中的所有排列总是反映引用元素的当前值,但如果是这样的话,为什么最终结果数组会为每个元素填充?numsresults.push()results.push([...nums])[1, 2, 3]numsnumsnumsnumsresult[1, 2, 3]

我以为我以前对通过引用与通过价值有很强的理解,但现在我怀疑这种理解。对此的任何澄清将不胜感激,因为我觉得我快到了,但无法完全点击它。

感谢您抽出宝贵时间阅读/帮助。

JavaScript 引用传递 按值传递 归回溯

评论

0赞 zer00ne 1/19/2022
你的代码有效吗?我们修复代码: 如何询问 post 代码:最小可重现示例
0赞 Barmar 1/19/2022
如果你不做一个副本,那么所有的元素都将是同一个数组,当你交换元素时,它对所有元素的影响都是一样的。results
1赞 Bergi 1/19/2022
我看不出这与按引用调用与按值调用有什么关系。代码中只有一个数组和另一个数组(如果不进行复制)。numsresults
0赞 Bergi 1/19/2022
按值复制数组的可能重复项

答: 暂无答案