2
+VANO+Цитата:
Если рекурсией, то как?
Ну а это вообще элементарно. Просто оставляете один цикл, итерирующий счетчик, соответствующий уровню рекурсивной вложенности, а все остальные
штук циклов заменяете единственным вызовом самого себя (если остались свободные счетчики). Т.е. что-то вроде:
int i[k];
void f(int Level)
{
if(Level<k)
for(i[Level]=0; i[Level]<n; i[Level]++)
{
// One of your conditions here.
f(Level+1) // Recursive call.
}
else
// Innermost level (using i[0]..i[k-1]).
}
f(0);
Вышеописанное прибавление единицы может выглядеть так (нерекурсивное инкрементное решение):
int i[k]; // Initialize to zeroes.
bool Next()
{
for(int c=0; c<k; c++)
if(i[c]>=n-1) // Overflow detected.
i[c]=0;
else
{
i[c]++; // Change a digit.
return true;
}
return false;
}
Эта функция генерирует следующую комбинацию значений счетчиков и возвращает истину, если это новая комбинация. Т.е., использовать её надо примерно так:
do /* Innermost logic. */ while(Next());. Но здесь надо ещё подумать, куда же впендюрить ваши условия...
Можно ещё попробовать метапрограммирование от boost, но там используется препроцессор для генерации вложенных циклов.