/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Et variabelt antal for-løkker
Fra : Michael Knudsen


Dato : 23-09-06 11:04

Hej,

Givet et helt tal n>0 har jeg brug for at lave n for-løkker, som
sidder inden i hinanden. Altså:

for (x1=0; x1<m1; x1++)
{
for (x2=0; x2<m2; x2++)
{
for (x3=0; x3<m3; x3++)
{
....
for (xn=0; xn<mn; xn++)
{
}
....
}
}
}

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.

--
Michael Knudsen


 
 
Kim Schulz (23-09-2006)
Kommentar
Fra : Kim Schulz


Dato : 23-09-06 11:50

On 23 Sep 2006 03:04:17 -0700
"Michael Knudsen" <micknudsen@gmail.com> wrote:

> Hej,
>
> Givet et helt tal n>0 har jeg brug for at lave n for-løkker, som
> sidder inden i hinanden. Altså:
>
> for (x1=0; x1<m1; x1++)
> {
> for (x2=0; x2<m2; x2++)
> {
> for (x3=0; x3<m3; x3++)
> {
> ....
> for (xn=0; xn<mn; xn++)
> {
> }
> ....
> }
> }
> }
>
> 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.
>

Jeg tvivler på at det er det ovenstående du ønsker, men hvis du giver
en forklaring på hvad det skal bruges til, så kan vi jo nok komme med
en smartere løsning til dig.

--
Kim Schulz | Private : http://www.schulz.dk
Kim@schulz.dk | Business: http://www.devteam.dk
+45 5190 4262 | Sparetime: http://www.fundanemt.com

Thorbjørn Ravn Ander~ (23-09-2006)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 23-09-06 11:50

"Michael Knudsen" <micknudsen@gmail.com> writes:

> 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.

Næh, du er nødt til at kode det ved at holde styr på indeks, maxværdi
og nuværende værdi selv for hvert niveau. Et array til hvert er nok
en god ide, og kan klares uden rekursion.

--
Thorbjørn Ravn Andersen

Lasse Reichstein Nie~ (23-09-2006)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 23-09-06 12:05

"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.'

Michael Knudsen (23-09-2006)
Kommentar
Fra : Michael Knudsen


Dato : 23-09-06 14:13

Kim Schulz wrote:

> Jeg tvivler på at det er det ovenstående du ønsker, men hvis du giver
> en forklaring på hvad det skal bruges til, så kan vi jo nok komme med
> en smartere løsning til dig.

Mit problem er følgende: Jeg har en funktion f af n variable, hvor n
kan variere. Jeg vil gerne finde den minimale værdi af f evalueret i
alle punkterne i et gitter, for eksempel alle n-tuplerne
(x_1,x_2,...,x_n), hvor alle x_i er i mængden {1,2,...,m}.

--
Michael Knudsen


Michael Zedeler (23-09-2006)
Kommentar
Fra : Michael Zedeler


Dato : 23-09-06 14:31

Michael Knudsen wrote:
> Kim Schulz wrote:
>
>>Jeg tvivler på at det er det ovenstående du ønsker, men hvis du giver
>>en forklaring på hvad det skal bruges til, så kan vi jo nok komme med
>>en smartere løsning til dig.
>
> Mit problem er følgende: Jeg har en funktion f af n variable, hvor n
> kan variere. Jeg vil gerne finde den minimale værdi af f evalueret i
> alle punkterne i et gitter, for eksempel alle n-tuplerne
> (x_1,x_2,...,x_n), hvor alle x_i er i mængden {1,2,...,m}.

Det er nemmere hvis x_i'erne er i intervallet [0;m-1]. Du kan altid
rette det...

Pseudokode:

n: antal dimensioner
m: loft

# Tællere i array
a = array(n);

# Initialisér tællere
for(i=1; i<=n; i++) a(i)=0;

while(1 == 1) {
   # Blok der tæller tællerne op
   i = 0;
   do {
      i++;
      # % er modulo-funktion
      a(i) += 1 % (m+1);
   } while(a(i) == 0 and i < n);

   # Stopkriterie:
   if(i == n and a(i) == 0) break;

   # Kald funktion
   minfunktion(a);
}

Med forbehold for off by one-fejl og andet.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Michael Zedeler (23-09-2006)
Kommentar
Fra : Michael Zedeler


Dato : 23-09-06 14:34

Michael Zedeler wrote:
> Med forbehold for off by one-fejl og andet.

Der er faktisk helt sikkert nogle off by one-fejl, men grundstrukturen
kan i hvert fald bruges.

Man kan også gå den anden vej og tælle fra 1 til m^n, hvor man hver gang
der tælles en op, konverterer fra heltal til m-base-tal og stopper dem i
tællerne. Det er nok af mere akademisk interesse, da det nok ikke kan
blive specielt effektivt.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste