为什么我的矩阵显示错误的输出?

Why is my matrix showing the wrong output?

我正在尝试使用递归查找数组 [1,2,3] 的排列。如果我直接打印出基本情况下的排列,一切都工作正常,但我想将所有排列存储在一个单独的数组中。我通过将数组推入矩阵来做到这一点,但它显示了错误的输出,即所有被推入的数组都是相同的。我无法找出错误是什么。请帮忙

let arr = [1, 2, 3];
let matrix = [];
let index = 0;

function perm(arr, index) {
    if (index === arr.length) {
        console.log('arr:', arr);
        matrix.push(arr);
        return;
    }

    for (let i = index; i < arr.length; i++) {
        [arr[i], arr[index]] = [arr[index], arr[i]];
        perm(arr, index + 1);
        [arr[i], arr[index]] = [arr[index], arr[i]];
    }
}

perm(arr, index);
console.log(matrix);

这是我得到的输出:

arr: [ 1, 2, 3 ]
arr: [ 1, 3, 2 ]
arr: [ 2, 1, 3 ]
arr: [ 2, 3, 1 ]
arr: [ 3, 2, 1 ]
arr: [ 3, 1, 2 ]
[
  [ 1, 2, 3 ],
  [ 1, 2, 3 ],
  [ 1, 2, 3 ],
  [ 1, 2, 3 ],
  [ 1, 2, 3 ],
  [ 1, 2, 3 ]
]

您将同一个数组 arr 多次推入 matrix,因此当您稍后更新它时,它会更新 matrix 中的所有行,因为它们是对同一个数组。

尝试复制数组 arr 之前:

matrix.push(arr.slice());