提问人:Leo C. 提问时间:1/19/2022 更新时间:1/19/2022 访问量:50
对于通过闭包共享引用的递归调用,按引用传递和按数组值传递有什么区别?
What is the difference between passing by reference and passing by value of arrays for recursive calls which share a reference via a closure?
问:
我正在研究以下提示的解决方案:给定一个不同整数的数组,返回所有可能的排列。您可以按任何顺序返回答案。
以下代码通过测试:
/**
* @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]
当我尝试传入而不是 时,我的理解差距是显而易见的,它返回适当长度的结果数组,但在每个索引处都用数组填充。为什么有必要在这里做一个浅拷贝,而不是直接推送?我的理解是,在递归调用中满足基本情况的点上,将是什么当前的排列。在存储我们的排列之后,我们回溯/取消交换并继续。我想一定是这样,数组中的所有排列总是反映引用元素的当前值,但如果是这样的话,为什么最终结果数组会为每个元素填充?nums
results.push()
results.push([...nums])
[1, 2, 3]
nums
nums
nums
nums
result
[1, 2, 3]
我以为我以前对通过引用与通过价值有很强的理解,但现在我怀疑这种理解。对此的任何澄清将不胜感激,因为我觉得我快到了,但无法完全点击它。
感谢您抽出宝贵时间阅读/帮助。
答: 暂无答案
评论
results
nums
results