目前我有这个代码片段,它正在做我想做的事情:给定一些对象,它会在它们之间创建所有可能的组合。
在此示例中,假设有 4 个对象(0、1、2 和 3),创建了 4 个对象的所有可能组合(0、1、2、3、01(0 和 1 的组合)、02、 03、12、13、23、012、013、023、123 和 0123)。
需要注意的是,有 2^4 - 1 = 15 种组合,一般是 2^ 对象数量 - 1 种组合。
使用此代码创建对象的顺序为:0 -> 01 -> 012 -> 0123 -> 013 -> 02 -> 023 -> 03 -> 1 -> 12 -> 123 -> 13 -> 2 -> 23 -> 3
我获取初始对象的方式和它们的数量在代码的其他地方定义。
int count = 4; //this is gotten elsewhere
int currPos = 0;
var objects = new Object[(2^count)-1];
for (int i = 0; i < count; i++) //loop that creates combinations of only one object
{
Object obj = new Object(...);
objects[currPos] = obj;
currPos += 1;
for (int j = i + 1; j < count; j++) //loop that creates combinations of two objects
{
Object obj = new Object(...);
objects[currPos] = obj;
currPos += 1;
for (int k = j + 1; k < count; k++) //loop that creates combinations of three objects
{
Object obj = new Object(...);
objects[currPos] = obj;
currPos += 1;
for (int l = k + 1; l < count; l++) //loop that creates combinations of four objects
{
Object obj = new Object(...);
objects[currPos] = obj;
currPos += 1;
}
}
}
}
尽管给出了正确的结果,但这是硬编码的,因此我正在寻找一种方法将其更改为递归函数(但保持其功能),以及对象的数量(这也决定了最大组合,示例中为四个)作为参数传递。
我一直在尝试做类似下面的代码但没有结果,主要是因为我似乎无法在必要时进入“上一个”循环,例如从 0123 到 013。
int count = 4;
int currPos = 0;
var objects = new Object[(2^count)-1];
combinations(count, 0, currPos, objects); //called elsewhere
private void combinations(int numberOfObjects, int j, int count, int currPos, Object[] objects)
{
if (numberOfObjects == count)
{
for (int k = j; k < count; k++)
{
Object obj = new Object(...);
objects[currPos] = obj;
currPos += 1;
generateCombinations(numberOfObjects - 1, j + 1, count, currPos, objects);
}
}
if (numberOfObjects < count)
{
for (int l = j; l < count; l++)
{
Object obj = new Object(...);
objects[currPos] = obj;
currPos += 1;
(...)
generateCombinations(..., ..., count, currPos, objects);
}
}
}