Hallo Leute!
Ich habe den rekursiven Code Türme von Hanoi (Quelle: Kopec Algorithmen in Java) versucht iterativ zu programmieren. Mein Code funktioniert auch. Aber, ich vermute, dass es einfacher geht. Hier mein "Erguß":
// HanoiIt.java
import java.util.Stack;
public class HanoiIt {
public static final Stack<Integer> towerA = new Stack<>();
public static final Stack<Integer> towerB = new Stack<>();
public static final Stack<Integer> towerC = new Stack<>();
public HanoiIt(int discs) {
for (int i = 1; i <= discs; i++) {
towerA.push(i);
}
}
public static void main(String[] args) {
HanoiIt hanoi = new HanoiIt(3);
System.out.println( "aufgefuellter Turm A:" + hanoi.towerA);
for(int i=0; i < towerA.size(); i++){
System.out.println( "Elemente am Turm A:" + towerA.get(i));
}
while ( towerC.size() != 3 ) {
if ( towerA.size() == 3) {
towerA.pop();
towerC.push(3);
towerA.pop();
towerB.push(2);
System.out.println("Schritt 1:");
System.out.println("Turm A:" + hanoi.towerA);
System.out.println("Turm B:" + hanoi.towerB);
System.out.println("Turm C:" + hanoi.towerC);
}
else if ((towerA.size() == 1) && (towerB.size() == 1) && (towerC.size() == 1)) {
towerC.pop();
towerB.push(3);
towerA.pop();
towerC.push(1);
System.out.println("Schritt 2:");
System.out.println("Turm A:" + hanoi.towerA);
System.out.println("Turm B:" + hanoi.towerB);
System.out.println("Turm C:" + hanoi.towerC);
}
else if (towerB.size() == 2) {
towerB.pop();
towerA.push(3);
towerB.pop();
towerC.push(2);
System.out.println("Schritt 3:");
System.out.println("Turm A:" + hanoi.towerA);
System.out.println("Turm B:" + hanoi.towerB);
System.out.println("Turm C:" + hanoi.towerC);
}
else if ((towerA.size() != 0) || (towerB.size() != 0)) {
towerA.pop();
towerC.push(3);
System.out.println("Schritt 4:");
System.out.println("Turm A:" + hanoi.towerA);
System.out.println("Turm B:" + hanoi.towerB);
System.out.println("Turm C:" + hanoi.towerC);
}
}
System.out.println("Hanoi-Tuerme fertig sortiert");
}
}
Kommt mir etwas "unhandlich" vor. Bitte um Verbesserungsideen.
Danke
Euer Wuerg
Ich habe den rekursiven Code Türme von Hanoi (Quelle: Kopec Algorithmen in Java) versucht iterativ zu programmieren. Mein Code funktioniert auch. Aber, ich vermute, dass es einfacher geht. Hier mein "Erguß":
// HanoiIt.java
import java.util.Stack;
public class HanoiIt {
public static final Stack<Integer> towerA = new Stack<>();
public static final Stack<Integer> towerB = new Stack<>();
public static final Stack<Integer> towerC = new Stack<>();
public HanoiIt(int discs) {
for (int i = 1; i <= discs; i++) {
towerA.push(i);
}
}
public static void main(String[] args) {
HanoiIt hanoi = new HanoiIt(3);
System.out.println( "aufgefuellter Turm A:" + hanoi.towerA);
for(int i=0; i < towerA.size(); i++){
System.out.println( "Elemente am Turm A:" + towerA.get(i));
}
while ( towerC.size() != 3 ) {
if ( towerA.size() == 3) {
towerA.pop();
towerC.push(3);
towerA.pop();
towerB.push(2);
System.out.println("Schritt 1:");
System.out.println("Turm A:" + hanoi.towerA);
System.out.println("Turm B:" + hanoi.towerB);
System.out.println("Turm C:" + hanoi.towerC);
}
else if ((towerA.size() == 1) && (towerB.size() == 1) && (towerC.size() == 1)) {
towerC.pop();
towerB.push(3);
towerA.pop();
towerC.push(1);
System.out.println("Schritt 2:");
System.out.println("Turm A:" + hanoi.towerA);
System.out.println("Turm B:" + hanoi.towerB);
System.out.println("Turm C:" + hanoi.towerC);
}
else if (towerB.size() == 2) {
towerB.pop();
towerA.push(3);
towerB.pop();
towerC.push(2);
System.out.println("Schritt 3:");
System.out.println("Turm A:" + hanoi.towerA);
System.out.println("Turm B:" + hanoi.towerB);
System.out.println("Turm C:" + hanoi.towerC);
}
else if ((towerA.size() != 0) || (towerB.size() != 0)) {
towerA.pop();
towerC.push(3);
System.out.println("Schritt 4:");
System.out.println("Turm A:" + hanoi.towerA);
System.out.println("Turm B:" + hanoi.towerB);
System.out.println("Turm C:" + hanoi.towerC);
}
}
System.out.println("Hanoi-Tuerme fertig sortiert");
}
}
Kommt mir etwas "unhandlich" vor. Bitte um Verbesserungsideen.
Danke
Euer Wuerg
Zuletzt bearbeitet: