Сделать рекурсию для вложенных циклов

Вроде и не сложная задача, но решить не могу. Вот надо сделать рекурсию цикла tstRec1() (Там будет неизвестное число ) Я попробовал сделать в tstRec2(). Но не понятно как сделать именно сделать добавление именно в том порядке что в tstRec1() :

List<int> poh = new List<int>();
List<int> poh2 = new List<int>();

public void startTest()
{
    tstRec2(2, 2);
    tstRec1();
}
public void tstRec1()
{
    
    for (int i = 0; i < 2; i++)
    {
        for (int u = 0; u < 2; u++)
        {
            for (int s = 0; s < 2; s++)
            {
                poh.Add(i);
                poh.Add(u);
                poh.Add(s);
            }
        }
    }
    
}

public void tstRec2(int countZikls, int counter, int lvl = 0, int transport = 0)
{
    for (int i = 0; i < counter; i++)
    {          
        if (lvl > countZikls)
        {
            
            break;
        }
        else if (lvl == countZikls)
        {
            poh2.Add(i);
        }
        else
        {
            tstRec2(countZikls, counter, lvl+1, i);
        }  
    }
}

Ответы (1 шт):

Автор решения: aepot

Как-то так получается

static void Main(string[] args)
{
    Console.WriteLine(string.Join(" ", TestRec1(2)));
    Console.WriteLine(string.Join(" ", TestRec2(2, 2)));
}

public static List<int> TestRec1(int count)
{
    List<int> list = new List<int>();
    for (int i = 0; i < count; i++)
    {
        for (int j = 0; j < count; j++)
        {
            for (int k = 0; k < count; k++)
            {
                list.Add(i);
                list.Add(j);
                list.Add(k);
            }
        }
    }
    return list;
}

public static List<int> TestRec2(int maxDepth, int count)
{
    List<int> list = new List<int>();
    for (int i = 0; i < count; i++)
    {
        List<int> values = new List<int> { i };
        TestRec2(list, maxDepth, count, values, 1);
    }
    return list;
}

private static void TestRec2(List<int> list, int maxDepth, int count, List<int> values, int depth)
{
    values.Add(0);
    for (int i = 0; i < count; i++)
    {
        values[values.Count - 1] = i;
        if (depth < maxDepth)
            TestRec2(list, maxDepth, count, values, depth + 1);
        else
            list.AddRange(values);
    }
    values.RemoveAt(values.Count - 1);
}

Вывод в консоль

0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1
0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1

На самом деле, задача похожа на фокусы с системами счисления: сгенерировать все числа, где maxDepth - длина числа, а count - основание системы счисления. В вашем случае нужно просто все цифры в этих числах добавить с список. Собственно, вот решение:

public static List<int> TestRec3(int maxDepth, int count)
{
    List<int> list = new List<int>();
    int length = maxDepth + 1;
    int total = (int)Math.Pow(count, length);
    for (int i = 0; i < total; i++)
    {
        int[] digits = new int[length];
        int x = i;
        for (int j = maxDepth; j >= 0 && x > 0; j--)
        {
            digits[j] = x % count;
            x /= count;
        }
        list.AddRange(digits);
    }
    return list;
}

Легко и просто через остаток от деления.

Console.WriteLine(string.Join(" ", TestRec3(2, 2)));

И точно такой же вывод в консоль.

0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1
→ Ссылка