Javascript 为什么这段代码返回一个空数组?
问题:给定一个不同整数的集合,返回所有可能的置换 示例:输入:[1,2,3] 期望输出: [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 在JavaScript中数组不是通过引用传递的吗?为什么返回结果数组时它是空的Javascript 为什么这段代码返回一个空数组?,javascript,algorithm,recursion,data-structures,permutation,Javascript,Algorithm,Recursion,Data Structures,Permutation,问题:给定一个不同整数的集合,返回所有可能的置换 示例:输入:[1,2,3] 期望输出: [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 在JavaScript中数组不是通过引用传递的吗?为什么返回结果数组时它是空的 /** *@param{number[]}nums *@return{number[][]} */ var permute=函数(nums){ var结果=[]; 助手(nums,result,[]); 返回结果; }; var
/**
*@param{number[]}nums
*@return{number[][]}
*/
var permute=函数(nums){
var结果=[];
助手(nums,result,[]);
返回结果;
};
var helper=函数(nums、result、cur){
if(cur.length==nums.length){
结果:推送(cur);
}否则{
for(设i=0;i log(permute([1,2,3])
调用助手时,您只能创建一个cur
数组:
helper(nums, result, []);
然后在helper
中进行变异和递归传递。内存中只有一个数组;最后,您已经.pop
从数组中删除了最后一项,result
数组中的每一项都指向同一个对象,即现在为空的cur
数组
相反,在循环内克隆cur
,这样当/如果推送它时,您推送的是一个新数组,而不是对旧数组的引用,旧数组将在任何地方重复使用:
for (let i = 0; i < nums.length; i++) {
const temp = cur;
cur = [...cur, nums[i]]; // Similar to `.push`, except it creates a new array
helper(nums, result, cur);
cur = temp; // Similar to `.pop` - reverts the array to what it was originally
}
for(设i=0;i
var permute=函数(nums){
var结果=[];
助手(nums,result,[]);
返回结果;
};
var helper=函数(nums、result、cur){
if(cur.length==nums.length){
结果:推送(cur);
}否则{
for(设i=0;i log(permute([1,2,3])
调用助手时,您只能创建一个cur
数组:
helper(nums, result, []);
然后在helper
中进行变异和递归传递。内存中只有一个数组;最后,您已经.pop
从数组中删除了最后一项,result
数组中的每一项都指向同一个对象,即现在为空的cur
数组
相反,在循环内克隆cur
,这样当/如果推送它时,您推送的是一个新数组,而不是对旧数组的引用,旧数组将在任何地方重复使用:
for (let i = 0; i < nums.length; i++) {
const temp = cur;
cur = [...cur, nums[i]]; // Similar to `.push`, except it creates a new array
helper(nums, result, cur);
cur = temp; // Similar to `.pop` - reverts the array to what it was originally
}
for(设i=0;i
var permute=函数(nums){
var结果=[];
助手(nums,result,[]);
返回结果;
};
var helper=函数(nums、result、cur){
if(cur.length==nums.length){
结果:推送(cur);
}否则{
for(设i=0;i log(permute([1,2,3])代码>否,JavaScript中的所有内容都是按值传递的。在函数helper
中,将创建一个局部变量result
,然后在调用helper
时为其赋值。您最想做的是:result=helper(nums,result,[])代码>不,JavaScript中的所有内容都是按值传递的。在函数helper
中,将创建一个局部变量result
,然后在调用helper
时为其赋值。您最想做的是:result=helper(nums,result,[])代码>“JavaScript中的所有内容都是通过值传递的。”从技术上讲,这是正确的。但是为非原语参数复制和传递的值是对基础项的引用。因此,调用者和被调用者有两个不同的引用,每个引用指向相同的值。换句话说,helper
中的result
变量(除非重新赋值)是对permute
中使用的引用result
所引用的相同项的引用。从技术上讲,这是正确的。但是为非原语参数复制和传递的值是对基础项的引用。因此,调用者和被调用者有两个不同的引用,每个引用指向相同的值。换句话说,helper
中的result
变量(除非重新指定)是对permute
中使用的引用result
所引用的相同项的引用。