簡體   English   中英

Javascript 遞歸函數。 將數據存儲在數組中時結果錯誤

[英]Javascript Recursive function. Wrong results while storing data in array

在嘗試使用 Heap 算法獲取所有排列時,我遇到了將結果存儲在數組中的問題。

生成的結果是(來自 console.log(arr);)
[“1”、“2”、“3”]
[“2”、“1”、“3”]
[“3”、“1”、“2”]
[“1”、“3”、“2”]
[“2”、“3”、“1”]
[“3”、“2”、“1”]

但只有最后一個值存儲在 arr 中,並且以某種方式存儲的數組是這個(來自 console.log(JSON.stringify(allPermutations)); )
[“3”、“2”、“1”]
[“3”、“2”、“1”]
[“3”、“2”、“1”]
[“3”、“2”、“1”]
[“3”、“2”、“1”]
[“3”、“2”、“1”]

var allPermutations = [];

function swap(arr,index1,index2){
    var dummy = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = dummy;
    return arr;
}

function generate(n,arr){
    if(n==1){
        console.log(arr);
            //result:
            //["1", "2", "3"]
            //["2", "1", "3"]
            //["3", "1", "2"]
            //["1", "3", "2"]
            //["2", "3", "1"]
            //["3", "2", "1"]
        allPermutations.push(arr);
    }else{
        for(var i=0;i<n-1;i++){
            generate(n-1,arr);
            if( n%2 ==0){
                arr = swap(arr,i,n-1);
            }else{
                arr = swap(arr,0,n-1);
            }
        }
        generate(n - 1, arr);
    }
}

generate(3,['1','2','3']);

console.log(JSON.stringify(allPermutations));
/*result:
["3","2","1"]
["3","2","1"]
["3","2","1"]
["3","2","1"]
["3","2","1"]
["3","2","1"]*/

這有什么問題? 很想了解。 謝謝

allPermutations.push(arr)替換為allPermutations.push(arr.slice())

問題是,您不斷推送同一個數組,然后更改該數組。 當你推送一個數組時,你不會推送它的副本:你推送的是一個引用。 只有一個數組,並且有六個對它的引用; 當您讀出它們時,它們都讀取相同的內容,因為它們都是相同的數組

.slice()會給你一個具有相同元素的新數組; 這樣,您將在結果中添加六個新數組,而不是六個提及同一數組。

從我之前的一個幾乎但不完全重復的答案中,我喜歡這個比喻:

作為一個比喻,想象一個戲劇導演在選角。 他轉向一位演員,說:“你……你將成為羅密歐。”。 然后他看着同一個演員,說:“你……你就是墨丘西奧。來,墨丘西奧,拿這把劍。羅密歐……誰讓你拿劍的?!?” 完全沒有意識到,如果羅密歐和墨丘西奧是同一個人,如果其中一個拿起劍,另一個也會這樣做。

那是因為數組是對象,而對象是按值傳遞的,但該值是一個引用。

然后,您的代碼不斷向allPermutations推送相同的arr引用。 但是該引用中的值稍后會被修改。

相反,您應該推送數組的副本。 你可以用.slice()復制它。

 var allPermutations = []; function swap(arr, index1, index2) { var dummy = arr[index1]; arr[index1] = arr[index2]; arr[index2] = dummy; return arr; } function generate(n, arr) { if (n == 1) { allPermutations.push(arr.slice()); } else { for (var i = 0; i < n - 1; i++) { generate(n - 1, arr); if (n % 2 == 0) { arr = swap(arr, i, n - 1); } else { arr = swap(arr, 0, n - 1); } } generate(n - 1, arr); } } generate(3, ['1', '2', '3']); document.write(JSON.stringify(allPermutations));

暫無
暫無

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

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