返回所有排列的JavaScript函数

时间:2019-03-10 12:06:44

标签: javascript arrays function recursion parameters

我一直在尝试创建一个函数,该函数生成从0到num的数字的所有排列并将它们存储在多维数组中。我想在组合变量中存储类似的内容:

 [ [ 1, 2, 3 ],
    [ 1, 3, 2 ],
    [ 2, 1, 3 ],
    [ 3, 1, 2 ],
wrongly     [ 2, 3, 1 ],
    [ 3, 2, 1 ] ]

但是我得到了:

[ [ 3, 2, 1 ],
  [ 3, 2, 1 ],
  [ 3, 2, 1 ],
  [ 3, 2, 1 ],
  [ 3, 2, 1 ],
  [ 3, 2, 1 ] ]

我的功能是:

var combinations = [];

function comb(num, index, list, used) {
  if (num == index)
    combinations.push(list);
  else {
    for (var i = 0; i < num; ++i) {
      if (!used[i]) {
        list[i] = index + 1;
        used[i] = true;
        comb(num, index + 1, list, used);
        used[i] = false;
      }
    }
  }
}

我通常使用C ++进行编程,所以我认为我错误地使用了数组。

1 个答案:

答案 0 :(得分:3)

您的问题是,传递给递归调用的list数组将被更改,因为它实际上是通过引用传递的,因此list将丢失其先前的组合。相反,您可以使用传播语法(...)将数组传递到递归调用中之前对其进行复制。

请参见下面的工作示例:

var combinations = [];

function comb(num, index, list, used) {
  if (num == index)
    combinations.push(list);
  else {
    for (var i = 0; i < num; ++i) {
      if (!used[i]) {
        list[i] = index + 1;
        used[i] = true;
        comb(num, index + 1, [...list], used);
        used[i] = false;
      }
    }
  }
}

comb(3, 0, [], []);
console.log(combinations); // [[1,2,3],[1,3,2],[2,1,3],[3,1,2],[2,3,1],[3,2,1]]
.as-console-wrapper { max-height: 100% !important; top: 0;}