Javascript 闭包中的 var 总是包含相同的元素?
Javascript a var in closure always contain the same element?
请参阅此处 fiddle JSFIDDLE
var combine = function(n, k) {
function backtracking(n, k) {
if(k){ // min(k)=1, when k=0 break
for(var i=1; i<=n; ++i){
if(!used[i]){
used[i] = true;
solution[k-1] = i; // solution.length=k
// console.log(solution.length);
arguments.callee(n, k-1);
used[i] = false;
}
}
}else{
console.log(solution);
return result.push(solution); // ?
}
}
var used = [],
result = [],
solution = [];
if(k>n){
return [];
}else{
backtracking(n, k);
}
return result;
};
var b = combine(4, 2);
console.log(b);
为什么结果数组总是包含相同的元素>我的意思是它应该与数组解决方案具有相同的值?
b 输出:
[[3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4]]
我期望这样:
[[2, 1], [3, 1], [4, 1], [1, 2], [3, 2], [4, 2], [1, 3], [2, 3], [4, 3], [1, 4], [2, 4], [3, 4]]
我猜这是一个闭包问题。但是我该怎么做呢???
我尝试将 result[]
作为全局 var.but 仍然不起作用..
我看到了 post。但它是在一个循环中关闭的。但这不是由循环问题引起的。循环实际上有效 fine.It 是闭包中的递归问题..
当你打电话时:
return result.push(solution);
您仍在再次使用同一个 Array 对象,以后对该对象的任何更改都将保留在结果上。
每次将其推送到结果时,您都需要克隆解决方案对象:
return result.push(solution.slice(0));
这是新的 Fiddle:Fiddle。
请参阅此处 fiddle JSFIDDLE
var combine = function(n, k) {
function backtracking(n, k) {
if(k){ // min(k)=1, when k=0 break
for(var i=1; i<=n; ++i){
if(!used[i]){
used[i] = true;
solution[k-1] = i; // solution.length=k
// console.log(solution.length);
arguments.callee(n, k-1);
used[i] = false;
}
}
}else{
console.log(solution);
return result.push(solution); // ?
}
}
var used = [],
result = [],
solution = [];
if(k>n){
return [];
}else{
backtracking(n, k);
}
return result;
};
var b = combine(4, 2);
console.log(b);
为什么结果数组总是包含相同的元素>我的意思是它应该与数组解决方案具有相同的值?
b 输出:
[[3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4]]
我期望这样:
[[2, 1], [3, 1], [4, 1], [1, 2], [3, 2], [4, 2], [1, 3], [2, 3], [4, 3], [1, 4], [2, 4], [3, 4]]
我猜这是一个闭包问题。但是我该怎么做呢???
我尝试将 result[]
作为全局 var.but 仍然不起作用..
我看到了 post。但它是在一个循环中关闭的。但这不是由循环问题引起的。循环实际上有效 fine.It 是闭包中的递归问题..
当你打电话时:
return result.push(solution);
您仍在再次使用同一个 Array 对象,以后对该对象的任何更改都将保留在结果上。 每次将其推送到结果时,您都需要克隆解决方案对象:
return result.push(solution.slice(0));
这是新的 Fiddle:Fiddle。