簡體   English   中英

Javascript計算排列-當我不復制數組時,為什么我的代碼返回不需要的解決方案?

[英]Javascript computing permutations - why is my code returning unwanted solution when I don't make a copy of the array?

以下是返回給定數組的所有排列的函數的代碼。

function getAllPerms(s) {
  var perms = [];
  if (s.length === 1) {
    perms.push(s);
    } else {
        for (var i = 0; i < s.length; i++) {
            var sub = s.slice(0);
            sub.splice(i, 1);
            var sp = getAllPerms(sub);
            for (var o = 0; o < sp.length; o++) {
                sp[o].unshift(s[i]);
                perms.push(sp[o]);
            }
        }
    }
    return perms;
  }
  console.log(getAllPerms([1,2]));  // result is [[1, 2], [2, 1]]

但是,如果我不復制該數組並拼接原始數組,則不會得到相同的輸出,並且我一直在絞盡腦汁理解為什么? 對我來說,似乎它應該以任何一種方式起作用。 以下是更改原始數組的代碼。

function getAllPerms(s) {
    var perms = [];
    var len = s.length
    if (s.length === 1) {
        perms.push(s);
    } else {
        for (var i = 0; i < len; i++) {
            var digit = s[i];
            s.splice(i, 1);
            var sp = getAllPerms(s);
            for (var o = 0; o < sp.length; o++) {
                sp[o].unshift(digit);
                perms.push(sp[o]);
            }
        }
    }
    return perms;
}
console.log(getAllPerms([1,2])); // result is [[2, 1], [2, 1]]

對於第一組代碼,我得到正確的結果,[[1,2],[2,1]],但是對於第二部分代碼,我得到了奇怪的結果,[[2,1],[2,1] ]。 無法為我的生活弄清楚發生了什么事。

當您運行更改原始數組的代碼時,實際上是將輸入數組s修改為首先[1,2]然后是[2,1] ,而返回數組只是原始數組s多次,因此修改成為第二個元素的s也會將其修改為第一個元素。

通過運行以下命令,您可以更簡單地看到效果:

var x = [1,2]
var p = []
p.push(x)
x[0] = 2
x[1] = 1
p.push(x)

觀察每行之后xp變化。

暫無
暫無

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

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