[英]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; ....
可能會產生影響的另一件事是,您總是將引用傳遞給數組:可能對結果有影響的已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
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.