"Michael Knudsen" <micknudsen@gmail.com> writes:
> Givet et helt tal n>0 har jeg brug for at lave n for-løkker, som
> sidder inden i hinanden. Altså:
....
Kender du n når du skriver koden, eller først på kørselstidspunktet?
Hvis det første, så skriver du det bare. Hvis du skal lave løkkerne
dynamisk, så har du ikke adgang til at lave variable dynamisk, så du
skal have en anden måde at gemme tallene, fx et array.
> Findes der en smart måde at gøre dette på i Java? Måske ved hjælp
> af rekursion, men det må helst ikke være sådan, at det kræver for
> megen hukommelse.
Det kommer selvfølgelig an på hvor stor n (og m1 .. mn) er,
men det kan gøres både med og uden rekursion.
eksempel 1, rekursivt (kode ikke tjekket af compiler):
// Kalder doPart.call med array der indeholder alle kombinationer
// af værdier punktvis mindre end ms.
public static void bigFor(int[] ms, Callable<int[]> doPart) {
bigForRec(0, new int[ms.length], ms, doPart);
}
private static void bigForRec(int i, int[] xs, int[] ms,
Callable<int[]> doPart) {
if (i >= xs.length) {
doPart.call(xs);
} else {
for(xs[i] = 0; xs[i] < ms[i]; xs[i]++) {
bigForRec(i+1, xs, ms, doPart);
}
}
}
Eksempel 2, ikke rekursivt (heller ikke tjekket af compiler):
// alle ms[i] positive
public static void BigFor(int[] ms, Callable<int[]> doPart) {
int[] xs = new int[ms.length];
do {
doPart.call(xs);
} while (increment(xs,ms));
}
// xs.length == ms.length.
public static boolean increment(int[] xs, int[] ms) {
for (int i = xs.length - 1; i >= 0; i--) {
xs[i]++;
if (xs[i] < ms[i]) { return true; }
xs[i] = 0;
}
return false;
}
Held og lykke.
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:
http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'