цикл for динамический / рекурсивный? - PullRequest
0 голосов
/ 07 февраля 2019

У меня проблема в том, что у меня есть 6 циклов for, но я хочу удалить циклы и заменить их рекурсивным / динамическим методом ... к сожалению, я понятия не имею, как я могу это сделать.Может быть, один из вас может помочь мне.

for (int a = 1; a < 45; a++)
                {
                    for (int b = a + 1; b < 46; b++)
                    {
                        for (int c = b + 1; c < 47; c++)
                        {
                            for (int d = c + 1; d < 48; d++)
                            {
                                for (int e = d + 1; e < 49; e++)
                                {
                                    for (int f = e + 1; f < 50; f++)
                                    {                                           
                                        counter++;
                                        new_counter = zaehler.ToString("N0");
                                        Console.WriteLine(a + " " + b + " " + c + " " + d + " " + e + " " + f + " | -> " + new_counter);
                                        if (zaehler == 13983816)
                                        {
                                            Console.ForegroundColor = ConsoleColor.Green;
                                            Console.WriteLine($"{new_counter} combinations.");
                                            Console.ReadKey();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

1 Ответ

0 голосов
/ 07 февраля 2019

Общие намерения здесь немного сложны, но вот динамически рекурсивная версия, в которой , кажется, делает нечто подобное;Я еще не полностью проверил его на эквивалентность:

static void RunLoop(int depth, int from, int to, Action<int, int[]> callback)
{
    int[] tokens = new int[depth];
    int counter = 0;
    RunLoop(tokens, 0, from, to, callback, ref counter);
}
private static void RunLoop(int[] tokens, int index, int from, int to,
    Action<int, int[]> callback, ref int counter)
{
    int nextIndex = index + 1;
    for(int i = from; i < to; i++)
    {
        tokens[index] = i;
        if (nextIndex == tokens.Length)
        {
            callback(counter, tokens);
            counter++; // post-increment when invoking the callback
        }
        else
        {
            counter++; // pre-increment when diving
            RunLoop(tokens, nextIndex, i + 1, to + 1, callback, ref counter);
        }
    }
}

с использованием:

public static void Main()
{
    RunLoop(6, 1, 45, (i, arr) => Console.WriteLine(i + ": " + string.Join(", ", arr)));
}

Ваше «что делать, когда достигается самая глубокая глубина», входит в callback;первый аргумент - это общий счетчик, а второй аргумент - последовательные токены, составляющие это значение.

...