Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Anzahl der ineinander verschachtelten for-Schleifen von Variable abhängig machen
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:
Java:
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:
Java:
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:
Java:
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.
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".
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:
Java:
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,
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.