我目前正在使用Javascript,但可以接受任何内容。我想生成大小为X的数组的元素的所有可能组合,其中每个元素只能是N个不同的值
例如,我的数组大小为X = 3,并且不同的值为N = 2
001 011 111 100 110 000 010 101
我认为就是所有的组合。我觉得这应该是一个常见的编程问题和一个简单的任务,但是却找不到任何能反映我需要的东西,大多数情况下都没有考虑到多次出现相同数字的可能性(例如111 )
答案 0 :(得分:1)
您应该将此视为递归问题:如何为字母[0, 1]
生成长度为3的组合?好了,您生成了长度2的所有组合,并为每个字符串(称为s
)生成了两个新结果:0s
和1s
。类似地,用于生成长度为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);