如何生成范围之间数组中元素的所有可能组合

时间:2018-12-14 23:37:49

标签: javascript algorithm

我目前正在使用Javascript,但可以接受任何内容。我想生成大小为X的数组的元素的所有可能组合,其中每个元素只能是N个不同的值

例如,我的数组大小为X = 3,并且不同的值为N = 2

001 011 111 100 110 000 010 101

我认为就是所有的组合。我觉得这应该是一个常见的编程问题和一个简单的任务,但是却找不到任何能反映我需要的东西,大多数情况下都没有考虑到多次出现相同数字的可能性(例如111 )

4 个答案:

答案 0 :(得分:1)

您应该将此视为递归问题:如何为字母[0, 1]生成长度为3的组合?好了,您生成了长度2的所有组合,并为每个字符串(称为s)生成了两个新结果:0s1s。类似地,用于生成长度为2的组合。

对于基本情况,对于长度1,我们可以只返回字母本身。

以下是一些JavaScript代码:

function combine(alphabet, length) {
  if (length === 1) return alphabet;
  let combinations = [];
  for (s of combine(alphabet, length - 1))
    for (c of alphabet)
      combinations.push(c + s);
  return combinations;
}

或者,如果要支持获取长度为0的组合,则基本情况可以返回仅包含空字符串的列表:

function combine(alphabet, length) {
  if (length === 0) return [""];
  let combinations = [];
  for (s of combine(alphabet, length - 1))
    for (c of alphabet)
      combinations.push(c + s);
  return combinations;
}

答案 1 :(得分:1)

这可能是您需要的:

function combinations(size, values) {
    var result = [];
    for (let k = 0; k < Math.pow(values, size); k++) {
        result.push(k.toString(values));
    }
    return result
}

这是从0到(values^size)-1进行计数,同时以基数values表示所有数字。

以一个或多个0开头的组合不会被填充。如果想获得0011、0101等,请填充它们。

示例:

对于3和2个不同值的大小,您将获得:

["0", "1", "10", "11", "100", "101", "110", "111"]

对于大小为4和3的不同值:

["0", "1", "2", "10", "11", "12", "20", "21", … ,"2202", "2210", "2211", "2212", "2220", "2221", "2222"]

答案 2 :(得分:0)

这是c中的代码可为您提供帮助:

// counter
#include <iostream>
using namespace std;
int main()
{
    int n,b,k;
    cin>>n>>b;
    int A[n+1];
    for(int i=0;i<=n;i++)
    {
        A[i]=0;    
    }
    while(A[n]!=1)
    {
        for(int i=(n-1);i>=0;i--)
        {
            cout<<A[i]<<"  ";
        }
        cout<<"\n";
        A[0]++;
        k=0;

    while(A[k]==b)
    {
        A[k]=0;
        A[k+1]++;
        k++;
    }
    }
    return 0;
}

应该很容易弄清楚,可以将其更改为java。

答案 3 :(得分:0)

一种方便的处理方法是在递归函数的参数中传递状态。然后,您可以简化回溯并使用一些不错的ES6便利性来使代码简短易读:

final BoundingBox boundingBox = BoundingBox.fromGeoPoints(geoPoints);