试图从数组中生成所有排列,但只得到一个小子集
Posted
技术标签:
【中文标题】试图从数组中生成所有排列,但只得到一个小子集【英文标题】:Trying to generate all permutations from array but only getting a small subset 【发布时间】:2019-11-08 06:11:39 【问题描述】:编辑:我会尽量在这个问题上更清楚:
我有这个数组[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])))
通过代码中的新编辑,我可以获得三元组的所有组合!但我想要更多,我想要组合成对和单例。我该怎么做?
所以并不是所有可能的组合都会生成。
我该如何解决这个问题?
【问题讨论】:
@Stuart 我也是这么想的,但在这种情况下,它不是“给我解决方案”而是“我的解决方案有错误”。 @ZivBen-或者,这是“我的代码有问题,我需要帮助修复它”,而不是“给我代码”。 以哈斯塔的名义,各位——这不是骗人的。 OP 已有代码,不需要这一步。解决 here 的错误是对另一个问题的完全不同的解决方案...... @VLAZ mod 标志在这里完全不合适。你不应该推荐那个。刘易斯旗将被拒绝。 @bosskay972:你没有被封禁。有人,或者几个人,根据他们的名声,认为这个问题是另一个问题的重复,有一段时间,它被标记为这样,这意味着它无法收到答案。但正如在 cmets 中看到的那样,VLAZ 辩称它不是重复的,并说服了足够多的人同意它现在恢复了正常状态。现在,理想情况下,有人可以提出修复建议。 【参考方案1】:这里有一个解决方案
这几乎可以满足您的需求。问题是它包含一个空数组:(
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]))
【讨论】:
非常感谢空数组,array.shift() 很酷我可以删除第一个元素,所以对我来说没问题! 赞成,如果你不介意回答的话。你正在为每个元素递归调用函数,我不明白你为什么在里面做一个 concat,你能否更新你的答案来解释内部循环是如何工作的以上是关于试图从数组中生成所有排列,但只得到一个小子集的主要内容,如果未能解决你的问题,请参考以下文章