javascript - 递归 Javascript 函数中的范围问题
问题描述
我有一个递归函数(执行堆算法来生成排列)。它似乎有一个可变范围问题。
function permute(starting_arr) {
var all_permutations = [];
heap(starting_arr, starting_arr.length-1);
console.log(all_permutations);
return all_permutations;
function heap(a, n) { // a = array, n = max index i.e. length -1
var temp_an;
if (a.length-1 == n) {
all_permutations.push(a);
}
if (n>1) {
heap(a.slice(), n-1);
}
for ( var i=0; i<n ; i++ ) {
temp_an = a[n];
if (n%2==0) {
a[n] = a[0]
a[0] = temp_an;
} else {
a[n] = a[i]
a[i] = temp_an;
}
all_permutations.push(a);
if (n>1) { heap(a.slice(), n-1); }
}
}
}
似乎问题出在“all_permutations.push(a)”上,因为如果我将其替换为 ...
all_permutations.push([]);
for ( var g=0 ; g<a.length ; g++ ) {
all_permutations[all_permutations.length-1][g] = a[g];
}
正如您所看到的,我正在尝试使用 slice,我已经读过它作为一种解决方案,允许您通过值而不是引用传递数组,例如在这个...
function x(arr){
arr.push(4);
}
var a = [1,2,3]
x(a);
console.log(a);
var b = [1,2,3]
x(b.slice());
console.log(b);
这确实有些作用,但它仍然无法正常工作。
谢谢你的帮助。
解决方案
如您所见,我正在尝试使用 slice,我已经阅读过它作为一种解决方案,允许您通过值而不是引用传递数组
是的,您发现了问题以及解决问题的正确方法。但是,您需要将其专门应用于该行
all_permutations.push(a);
在你的for
循环中:
all_permutations.push(a.slice());
推荐阅读
- asp.net - 将 asp.net 应用程序发布到 RDP 服务器时,如何为我的 IP 地址分配主机名?
- node.js - 在exports.handler 之外抛出错误/响应
- beautifulsoup - 美丽的汤 - 提取信息
- python - 使用 Tensorflow SparseTensors 进行高效的布尔掩码
- javascript - 如何在没有 DOM 的情况下获取元素高度?
- regex - Kusto 不支持正则表达式外观吗?
- javascript - CSS - 调整大小时防止文本移动
- javascript - 如何在上传到 S3 时限制文件的大小和 mimetype
- unity3d - 相机远距离路面纹理模糊
- javascript - json数据未显示在由js生成的表中