簡體   English   中英

Javascript遞歸無法正常工作

[英]Javascript recursion not functioning as expected

我將此方法從Java移植到Javascript。 通過其中包含9個對象的“原始”數組,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的子數組,為什么不起作用?

這是我初始化permute函數的方式:

            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
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM