Сделать рекурсию для вложенных циклов
Вроде и не сложная задача, но решить не могу. Вот надо сделать рекурсию цикла 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