javascript - 试图从数组中生成所有排列,但只得到一个小子集
问题描述
编辑:我会尽量在这个问题上更清楚:
我有这个数组[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])))
通过代码中的新编辑,我可以获得三元组的所有组合!但我想要更多,我想要组合成对和单例。我怎样才能做到这一点 ?
因此,并非所有可能的组合都会生成。
我怎样才能解决这个问题?
解决方案
这是一个解决方案
这几乎可以满足您的要求。问题是它包含一个空数组:(
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]))