【问题标题】:Simplest hand-rolled permutations and combinations最简单的手卷排列和组合
【发布时间】:2020-04-21 10:44:19
【问题描述】:

假设我有一个简单的数组["apple", "banana", "lemon", "mango"];

现在这个数组最简单的手动排列,比如说选择3,重复是:

let array = ["apple", "banana", "lemon", "mango"];

for (let i = 0; i < array.length; i++)
  for (let j = 0; j < array.length; j++)
    for (let k = 0; k < array.length; k++)
      console.log(`${array[i]} ${array[j]} ${array[k]}`);

同样,现在组合这个,选择3,不重复就是:

let array = ["apple", "banana", "lemon", "mango"];

for (let i = 0; i < array.length - 2; i++)
  for (let j = i + 1; j < array.length - 1; j++)
    for (let k = j + 1; k < array.length; k++)
      console.log(`${array[i]} ${array[j]} ${array[k]}`);

现在我想知道,是否有类似的简单手动生成方法:

  • 没有重复的排列
  • 重复组合

基本上是与上述示例类似的最简单方法,无需递归或复杂迭代 - 类似于生成其他两个变体的方法。

【问题讨论】:

  • 您如何定义“简单”?这似乎是一个非常广泛的问题。
  • 认知简单。像上面的例子那样简单的 for 循环,没有递归或复杂的迭代。本质上,如果有一种类似的方式来生成使用类似方法提到的其他两个。
  • 对不起,我不太明白你的意思。还不够清楚吗?

标签: javascript arrays algorithm combinations permutation


【解决方案1】:

对于与重复的组合,您可以简单地从i 开始第二个循环而不是i+1,第三个循环从j 开始而不是j+1+1 基本上是禁止重复的。

因为排列有点烦人......对于像你展示的小情况,你可以明确检查重复:

for (let i=0; i<n; i++) {
    for (let j=0; j<n; j++) {
       if (i !== j) {
           for (let k=0; k<n; k++) {
               if (i !== k && j !== k) {
                   ...
               }
           }
       }
    }
}

【讨论】:

  • 太棒了!谢谢,正是我要找的东西——想知道是否有可能将它作为一个函数来生成这些作为选择n的算法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2011-01-08
  • 2017-03-13
  • 1970-01-01
  • 2011-05-28
  • 2020-05-06
相关资源
最近更新 更多