Javascript 递归未按预期运行
Javascript recursion not functioning as expected
我将此方法从 Java 移植到 Java 脚本。对于其中包含 9 个对象的 "original" 数组,Java 代码生成了 3000 个大小为 4 的子数组。
在这段 javascript 代码中,我得到了 6 个大小为 9 的子数组。
var hitterArray = new Array();
function permute(level, permuted, used, original){
if (level == 4) {
hitterArray.push(permuted); //array of arrays
} else {
for (i = 0; i < original.length; i++) {
if (!used[i]) {
used[i] = true;
permuted.push(original[i]);
permute(level + 1, permuted, used, original);
used[i] = false;
}
}
}
}
我想要 3000 个大小为 4 的子数组,为什么不起作用?
这是我初始化置换函数的方式:
var used = new Array(results.length);
for(p = 0; p < used.length; p++){
used[p] = false;
}
var permuteArray = new Array();
permute(0, permuteArray, used, results);
洞察力赞赏
我认为错误出在你的 for 循环上,你需要用 var
声明 i
否则你将它设为全局变量。
for(var i = 0; ....
另一件可能会产生影响的事情是您总是传递对数组的引用:used
和 permuted
这可能会对结果产生一些影响,请考虑使用 array.slice()
创建它们的新副本。
而且我认为 9 个对象中的 4 个对象的排列应该是 3024 (9*8*7*6),所以你应该得到 3024 个 4
数组
编辑
function permute(level, permuted, used, original){
if (level == 4) {
hitterArray.push(permuted); //You don't need to create a copy here, but if performance is not an issue, you might want to do it, for clarity
} else {
for (var i = 0; i < original.length; i++) {
if (!used[i]) {
var newused = used.slice();
var newpermuted = permuted.slice();
newused[i] = true;
newpermuted.push(original[i]);
permute(level + 1, newpermuted, newused, original);
//used[i] = false; //this won't be needed as you've just created a copy of the original one
}
}
}
}
我将此方法从 Java 移植到 Java 脚本。对于其中包含 9 个对象的 "original" 数组,Java 代码生成了 3000 个大小为 4 的子数组。
在这段 javascript 代码中,我得到了 6 个大小为 9 的子数组。
var hitterArray = new Array();
function permute(level, permuted, used, original){
if (level == 4) {
hitterArray.push(permuted); //array of arrays
} else {
for (i = 0; i < original.length; i++) {
if (!used[i]) {
used[i] = true;
permuted.push(original[i]);
permute(level + 1, permuted, used, original);
used[i] = false;
}
}
}
}
我想要 3000 个大小为 4 的子数组,为什么不起作用?
这是我初始化置换函数的方式:
var used = new Array(results.length);
for(p = 0; p < used.length; p++){
used[p] = false;
}
var permuteArray = new Array();
permute(0, permuteArray, used, results);
洞察力赞赏
我认为错误出在你的 for 循环上,你需要用 var
声明 i
否则你将它设为全局变量。
for(var i = 0; ....
另一件可能会产生影响的事情是您总是传递对数组的引用:used
和 permuted
这可能会对结果产生一些影响,请考虑使用 array.slice()
创建它们的新副本。
而且我认为 9 个对象中的 4 个对象的排列应该是 3024 (9*8*7*6),所以你应该得到 3024 个 4
数组编辑
function permute(level, permuted, used, original){
if (level == 4) {
hitterArray.push(permuted); //You don't need to create a copy here, but if performance is not an issue, you might want to do it, for clarity
} else {
for (var i = 0; i < original.length; i++) {
if (!used[i]) {
var newused = used.slice();
var newpermuted = permuted.slice();
newused[i] = true;
newpermuted.push(original[i]);
permute(level + 1, newpermuted, newused, original);
//used[i] = false; //this won't be needed as you've just created a copy of the original one
}
}
}
}