试图从数组中生成所有排列,但只得到一个小子集

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,你能否更新你的答案来解释内部循环是如何工作的

以上是关于试图从数组中生成所有排列,但只得到一个小子集的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中生成数组的排列?

如何从所有排列中生成所有可能的组合?

按位移位以在 C 中生成所有可能的排列 [重复]

如何使用指针从2D char数组中生成一个句子

在 R 中生成列表的所有不同排列

如何在 PHP 中生成字符串的所有排列?