尝试从数组生成所有排列,但只得到一小部分

时间:2019-06-26 10:17:33

标签: javascript recursion combinations

编辑:我将在这个问题上更加清楚:

我有这个数组[1,2,3],我想生成所有这样的排列:

1,2,3 | 1,3,2 | 3,2,1 | 3,1,2 | 2,3,1 | 2,1,3 | 1 | 1,2 | 1,3 | 2 | 2,3 | 2,1 | 3 | 3,1 | 3,2

请注意,我们还需要一位和两位数的排列,在建议的重复项中未解决。

我试图使Python代码适应JavaScript:

function my_permutations(lst) {
if (lst.length == 0) {
    return []
}
if (lst.length == 1) {
    return [lst]
}
var l = []
var m;
var remLst;
for (var i = 0; i < lst.length; i++) {
    m = lst[i]
    remLst = lst.slice(0, i).concat(lst.slice(i + 1))
    my_permutations(remLst).forEach(function(element) {
        l.push([m].concat(element))
    });
}
return l
}

console.log(JSON.stringify(my_permutations([1, 2, 3])))

使用代码中的新编辑,我可以获得三元组的所有组合!但是我想要更多,我想要结合成对和单身人士。我该怎么办?

因此并非所有可能的组合都会生成。

我该如何解决?

1 个答案:

答案 0 :(得分:3)

这是一个解决方案

这几乎可以满足您的要求。问题在于它包含一个空数组:(

function my_permutations(lst) {
  var l = [[]]
  var m;
  var remLst;
  for(var i = 0; i < lst.length; i++) {
    m = lst[i]
    remLst = lst.slice(0, i).concat(lst.slice(i + 1))
    my_permutations(remLst).forEach(function(element){
      l.push([m].concat(element))
    })
  }
  return l
}

console.log(my_permutations([1, 2, 3]))

这是另一种方式

这肯定不是高效的,并且使用了许多新的javascript功能,但我认为它很漂亮。

const rotations = ([l, ...ls], right=[]) =>
  l ? [[l, ...ls, ...right], ...rotations(ls, [...right, l])] : []

const permutations = ([x, ...xs]) =>
  x ? permutations(xs).flatMap((p) => rotations([x, ...p])) : [[]]

const powerset = (xs) =>
  xs.reduce((ys, x) => [...ys, ...ys.map((y) => [x, ...y])], [[]])

const powerPermutations = (xs) =>
  powerset(xs).flatMap(permutations)

console.log(powerPermutations([1, 2, 3]))