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; ....

另一件可能会产生影响的事情是您总是传递对数组的引用:usedpermuted 这可能会对结果产生一些影响,请考虑使用 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
            }
        }
    }
}