# Anzahl der ineinander verschachtelten for-Schleifen von Variable abhängig machen



## r-ene (10. Nov 2012)

Hallo,
stehe gerade auf den Schlauch folgendes zu realisieren:
Ich will bestimmte for-Schleifen nur ausführen, wenn eine Variable eine bestimmte Bedingung erfüllt.
Problem ist, dass alle Schleifen ineinander verschachtelt sind und der Code im Inneren soll immer ausgeführt werden. Ist nicht einfach zu erklären, aber vielleicht versteht ihr das anhand des Beispiels:


```
int zahl;

for(int i=0; i<=zahl; i++) {  // Diese for-Schleife soll nur dastehen, falls zahl>=1
	for(int j=i+1; j<=zahl+1; j++) {  // Diese for-Schleife soll nur dastehen, falls zahl>=2
		for(int k=j+1; k<=zahl+2; k++) {  // Diese for-Schleife soll nur dastehen, falls zahl>=3
			// Code der immer ausgeführt werden soll
		}
	}
}
```

Ist die Variable zahl=1 sollte also folgendes ausgeführt werden:


```
int zahl;

for(int i=0; i<=zahl; i++) {
			// Code der immer ausgeführt werden soll
}
```

Ist die Variable zahl=2 sollte also folgendes ausgeführt werden:


```
int zahl;

for(int i=0; i<=zahl; i++) {
	for(int j=i+1; j<=zahl+1; j++) {
			// Code der immer ausgeführt werden soll
	}
}
```

Es sollen also "zahl" viele for-Schleifen um den Code geschachtelt werden. Für alle mit ein bisschen Stochastikerfahrung: Der Sinn ist, dass alle Kombinationen ohne Zurücklegen und ohne Berücksichtigung der Reihenfolge ausgegeben und verarbeitet werden.

Wie kann ich das realisieren?


----------



## Marco13 (10. Nov 2012)

So direkt mit mehreren for-Schleifen geht das nicht. Etwas abstrakt formuliert: Man muss sich den Zustand, der im Code durch diese mehreren For-Schleifen repräsentiert wird (also quasi "mehrere Laufvariablen") in einer Form speichern, die auch mit EINER for-Scheife verarbeitet werden kan. Etwas konkreter: Das was du suchst, ist schon bei http://www.java-forum.org/codeschnipsel-u-projekte/81973-combinatorics.html#post646341 dabei, als "UnorderedCombinationIterable".


----------



## TKausL (10. Nov 2012)

Mit Rekursion müsste es auch gehen


----------



## nillehammer (10. Nov 2012)

```
int zahl;
 
for(int i=0; i<=zahl; i++) {  // Diese for-Schleife soll nur dastehen, falls zahl>=1
    for(int j=i+1; j<=zahl+1; j++) {  // Diese for-Schleife soll nur dastehen, falls zahl>=2
        for(int k=j+1; k<=zahl+2; k++) {  // Diese for-Schleife soll nur dastehen, falls zahl>=3
            // Code der immer ausgeführt werden soll
        }
    }
}
```
Wenn ich das richtig verstehe, soll mindestens einmal in die for-Schleifen gegangen werden, damit auch die inneren Schleifen erreicht werden, aber Wiederholungen soll es nur geben, wenn die Zahl-Bedingungen erfüllt sind. Das könnte mit break erreicht werden:

```
for(int i=0; i<=zahl; i++) {  // Diese for-Schleife soll nur dastehen, falls zahl>=1
    for(int j=i+1; j<=zahl+1; j++) {  // Diese for-Schleife soll nur dastehen, falls zahl>=2
        for(int k=j+1; k<=zahl+2; k++) {  // Diese for-Schleife soll nur dastehen, falls zahl>=3
            // Code der immer ausgeführt werden soll
            if(zahl<3) break;
        }
      if(zahl <2) break;
    }
    if(zahl <1) break;
}
```
Ansonsten gibt es bei solcherart Verschachtelungen von mir (wie immer) den Rat, Dir zu überlegen, welcher Algorithmus hinter den Schleifen steht, diesem Algorithmus einen Namen zu geben und ihn in einer Methode mit geeigneten Parametern und return-Value auszulagern. Denn schon bei zweifach verschachtelten Schleifen ist es schwierig, den Ablauf zu überblicken,


----------



## r-ene (11. Nov 2012)

Ah super, danke für die Vorschläge.
@nillehammer: welchen Wert die Variabel zahl hat, ist ja vorher nicht bestimmt, daher kommt deine Variante nicht in Frage. Aber danke für die Hilfe.


----------



## nillehammer (12. Nov 2012)

r-ene hat gesagt.:
			
		

> @nillehammer: welchen Wert die Variabel zahl hat, ist ja vorher nicht bestimmt, daher kommt deine Variante nicht in Frage. Aber danke für die Hilfe.


Oh ja, da hab ich zu sehr an Deinem Codebeispiel gehangen, anstatt dem Text zu entnehmen, was Du machen willst...


----------

