Сегодня я столкнулся с этим раньше и подумал, что могу поделиться решением, которое мне в итоге пришло.Я не уверен, какова политика в отношении ответов на старые сообщения.Я просто согласен с тем фактом, что я столкнулся с этим вопросом сегодня утром, и такого рода вещи были бы полезны для меня.
Для эффективности я избежал рекурсии.Кроме того, он не использует какой-либо специфический материал для C ++ - он будет отлично работать и на C.
Мы пытаемся создать N вложенных циклов "for".Вместо использования
for(int i = 0; i<max; i++)
for (int j = 0; j<max; j++)
...
я заменю i, j, ... на массив: i [0], i [1], ..., i [n-1].
Вот мое решение:
const int n = /*Insert N here: how many loops do you need?*/;
int i[n+1]; // if "n" is not known before hand, then this array will need to be created dynamically.
//Note: there is an extra element at the end of the array, in order to keep track of whether to exit the array.
for (int a=0; a<n+1; a++) {
i[a]=0;
}
int MAX = 79; //That's just an example, if all of the loops are identical: e.g. "for(int i=0; i<79; i++)". If the value of MAX changes for each loop, then make MAX an array instead: (new) int MAX [n]; MAX[0]=10; MAX[1]=20;...;MAX[n-1]=whatever.
int p = 0; //Used to increment all of the indicies correctly, at the end of each loop.
while (i[n]==0) {//Remember, you're only using indicies i[0], ..., i[n-1]. The (n+1)th index, i[n], is just to check whether to the nested loop stuff has finished.
//DO STUFF HERE. Pretend you're inside your nested for loops. The more usual i,j,k,... have been replaced here with i[0], i[1], ..., i[n-1].
//Now, after you've done your stuff, we need to increment all of the indicies correctly.
i[0]++;
// p = 0;//Commented out, because it's replaced by a more efficient alternative below.
while(i[p]==MAX) {//(or "MAX[p]" if each "for" loop is different. Note that from an English point of view, this is more like "if(i[p]==MAX". (Initially i[0]) If this is true, then i[p] is reset to 0, and i[p+1] is incremented.
i[p]=0;
i[++p]++; //increase p by 1, and increase the next (p+1)th index
if(i[p]!=MAX)
p=0;//Alternatively, "p=0" can be inserted above (currently commented-out). This one's more efficient though, since it only resets p when it actually needs to be reset!
}
}
Вот и все.Надеемся, что комментарии дают понять, что это значит делать.Я думаю, что это должно быть довольно эффективно - почти столько же, сколько реальные вложенные циклы.Большая часть накладных расходов вначале является одноразовой, поэтому она должна быть более эффективной, чем использование рекурсивных функций и т. Д. (Пожалуйста, исправьте меня, если я ошибаюсь в этом вопросе).
Надеюсь, это кому-нибудь пригодитсядень.
Мир и любовь.