Если я хочу, чтобы перечислить через все комбинации несколько ограниченных значений, это достаточно легко:Перечисляя в бесконечность в более чем двух измерениях
for(int i = 0; i <= iMax; i++)
{
for(int j = 0; j <= jMax; j++)
{
for(int k = 0; k <= kMax; k++)
{
DoSomething(i,j);
}
}
}
Точно так же, если я хочу, чтобы перечислить над одного неограниченной значение, проверка некоторого условия, что достаточно легко тоже:
BigInteger i = 0;
while(true)
{
if(Condition(i)) { break; }
i++;
}
Но что перечисляя на все комбинации множественных неограниченная значения? За два, один из способов я знаю это "зиг-заг", например, так:
BigInteger i = 0;
BigInteger j = 0;
bool direction = true;
while(true)
{
if(Condition(i,j)) { break; }
if(direction)
{
if(j==0)
{
direction = false;
i++;
}
else
{
i++;
j--;
}
}
else
{
if(i==0)
{
direction = true;
j++;
}
else
{
j++;
i--;
}
}
}
Первые несколько (i
, j
) пар это будет производить являются: (0,0), (1 , 0), (0,1), (0,2), (1,1), (2,0), (3,0), (2,1), (1,2) ...
Итак, мой вопрос: как этот или какой-либо другой метод можно адаптировать для более чем двух измерений? например Если я хочу перебрать i
, j
и k
?
Примечание: Я знаю, что есть лучшие способы написания этих примеров, я просто написал их как можно проще для простоты.
вы получаете один перечисляя 2-кортежи теперь вы просто должны видеть, что есть очень простой один-однозначное соответствие между '(х, у, г)' и '((х, y), z) '; I – Carsten
Этот вид зависит от того, что такое условие перерыва и что вы знаете об этом. Вам нужно избегать случая, когда вы уходите в определенном направлении и никогда не попадаете в точку останова. – HamHamJ