В настоящее время у меня есть этот фрагмент кода, который делает то, что я хочу: для некоторых объектов он создает все возможные комбинации между ними.
В этом примере, представляя 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);
}
}
}
generateCombinations
другой функцией или опечаткой? - person Groo   schedule 21.07.2016