Общие намерения здесь немного сложны, но вот динамически рекурсивная версия, в которой , кажется, делает нечто подобное;Я еще не полностью проверил его на эквивалентность:
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
;первый аргумент - это общий счетчик, а второй аргумент - последовательные токены, составляющие это значение.