Hanoi rekursiv zu iterativ umbauen

P

PfiffPaff

Gast
Hallo Leute, hab mir mal hier die Hanoi-Türme rekursiv gebastelt:

Java:
public class HanoiRek {
	static void Tow(String Quelle, String Hilf, String Ziel, int n) {
		if (n == 1) 
			System.out.println ("Bewege Scheibe " +n+ " von " + Quelle + " nach " + Ziel);
		else{
			Tow(Quelle, Ziel, Hilf, n-1);
			System.out.println ("Bewege Scheibe " +n+ " von " + Quelle + " nach " + Ziel);
			Tow(Hilf, Quelle, Ziel, n-1);
		}
	}

	public static void main (String args []) {
		long start = System.currentTimeMillis();
		
		System.out.println ("Tuerme von Hanoi");
		Tow("Quelle", "Hilfsziel", "Ziel", 20);
		
		long end = System.currentTimeMillis();
		
		long duration = end - start;
		
		System.out.println("Es hat: " + duration/1000 + " Sekunden gedauert!");
	}
}

Aber das ist ja noch das einfache....
Ich würde das gerne iterativ machen und hab mir das jetzt erstmal mit Stift und Papier
überlegt.... nur irgendwie komm ich zu keinem Ergebnis da ich keine Intervalle erkennen kann.
Ich hab das mal jetzt auf dem Papier mit 6 Scheiben durchlaufen aber die Züge sind immer
anders....(Schwierig zu erklären) jedenfalls wüsste ich nicht wie ich das ordentlich in
Schleifen packen könnte damit es immer funktioniert.
 
P

PfiffPaff

Gast
Java:
public class HanoiIt {
	
	static void tow(int n) {
		int quelle = n;
		int ziel = 0;
		int hilfsziel = 0;
		
		while(quelle != 0 || hilfsziel != 0) {
			
			
		}
	}

	public static void main (String args []) {
		
	}
}

Das wäre mein Ansatz.... nur ich kann keine Regeln erstellen die IMMER
korrekt sind....
 
P

PfiffPaff

Gast
Das habe ich auch schon gefunden, das finde ich persönlich
nur grotten schlecht. Mehr als unübersichtlich.
 
P

PfiffPaff

Gast
Hab mir jetzt mal das erarbeitet:

Java:
public class HanoiIt {
	
	static void tow(int n) {
		int[] stapel = {n, 0, 0};
		int kleinste = 0;
		int zweitKleinste = 0;
		int frei = 2;
		
		System.out.println("Quelle hat: " + stapel[0] + " Scheiben!");
		System.out.println("Ziel hat: " + stapel[1] + " Scheiben!");
		System.out.println("Hilfsziel hat: " + stapel[2] + " Scheiben!");
		
		while(stapel[0] != 0 && stapel[1] != n) {
			if(kleinste == 0) {
				stapel[0] = stapel[0]--;
				stapel[1] = stapel[1]++;
			} else if(kleinste == 1) {
				stapel[1] = stapel[1]--;
				stapel[2] = stapel[2]++;
			} else if(kleinste == 2) {
				stapel[2] = stapel[2]--;
				stapel[0] = stapel[0]++;
			}
			
			if(kleinste == 2) {
				kleinste = 0;
			} else {
				kleinste++;
			}
			
			
			if(zweitKleinste == 0 && frei == 2) {
				stapel[0] = stapel[0]--;
				stapel[2] = stapel[2]++;
			} else if(zweitKleinste == 0 && frei == 1) {
				stapel[0] = stapel[0]--;
				stapel[1] = stapel[1]++;
			} else if(zweitKleinste == 1 && frei == 0) {
				stapel[1] = stapel[1]--;
				stapel[0] = stapel[0]++;
			} else if(zweitKleinste == 1 && frei == 2) {
				stapel[1] = stapel[1]--;
				stapel[2] = stapel[2]++;
			} else if(zweitKleinste == 2 && frei == 0) {
				stapel[2] = stapel[2]--;
				stapel[0] = stapel[0]++;
			} else if(zweitKleinste == 2 && frei == 1) {
				stapel[2] = stapel[2]--;
				stapel[1] = stapel[1]++;
			}
			
			zweitKleinste = frei;
			
			if(kleinste == 0 && zweitKleinste == 2) {
				frei = 1;
			} else if(kleinste == 0 && zweitKleinste == 1) {
				frei = 2;
			} else if(kleinste == 1 && zweitKleinste == 2) {
				frei = 0;
			} else if(kleinste == 1 && zweitKleinste == 0) {
				frei = 2;
			} else if(kleinste == 2 && zweitKleinste == 0) {
				frei = 1;
			} else if(kleinste == 2 && zweitKleinste == 1) {
				frei = 0;
			}
		}
		
		System.out.println("Quelle hat: " + stapel[0] + " Scheiben!");
		System.out.println("Ziel hat: " + stapel[1] + " Scheiben!");
		System.out.println("Hilfsziel hat: " + stapel[2] + " Scheiben!");
	}
	
	public static void main (String args []) {
		tow(3);
	}
}

Aber das terminiert nicht :(
 
P

PfiffPaff

Gast
Hab mal paar System.outs rein gehaun....

warum mcht er nach dem ersten Schritt:

3 | 0 | 0
1 | 2 | 0

ich hab doch stapel[0]-- und
stapel[1]++

Da müsste doch in Zeile 2 dann stehen

2 | 1 | 0

oO?
 

xehpuk

Top Contributor
Was soll
Code:
stapel[0] = stapel[0]--;
denn werden? Das dürfte nicht so viel machen. Das sollte wohl
Code:
stapel[0]--;
heißen.
 
P

PfiffPaff

Gast
Jup das hab ich bereits ausgebessert...

also das hier:

Hab mal paar System.outs rein gehaun....

warum mcht er nach dem ersten Schritt:

3 | 0 | 0
1 | 2 | 0

ich hab doch stapel[0]-- und
stapel[1]++

Da müsste doch in Zeile 2 dann stehen

2 | 1 | 0

oO?

ist immernoch aktuell!
 
P

PfiffPaff

Gast
Ich habs ausgebessert.....

Java:
public class HanoiIt {
	
	static void tow(int n) {
		int[] stapel = {n, 0, 0};
		int kleinste = 0;
		int zweitKleinste = 0;
		int frei = 2;
		
		System.out.println("Quelle hat: " + stapel[0] + " Scheiben!");
		System.out.println("Ziel hat: " + stapel[1] + " Scheiben!");
		System.out.println("Hilfsziel hat: " + stapel[2] + " Scheiben!");
		
		while(stapel[0] != 0 && stapel[1] != n) {
			if(kleinste == 0) {
				stapel[0]--;
				stapel[1]++;
			} else if(kleinste == 1) {
				stapel[1]--;
				stapel[2]++;
			} else if(kleinste == 2) {
				stapel[2]--;
				stapel[0]++;
			}
			
			if(kleinste == 2) {
				kleinste = 0;
			} else {
				kleinste++;
			}
			
			
			if(zweitKleinste == 0 && frei == 2) {
				stapel[0]--;
				stapel[2]++;
			} else if(zweitKleinste == 0 && frei == 1) {
				stapel[0]--;
				stapel[1]++;
			} else if(zweitKleinste == 1 && frei == 0) {
				stapel[1]--;
				stapel[0]++;
			} else if(zweitKleinste == 1 && frei == 2) {
				stapel[1]--;
				stapel[2]++;
			} else if(zweitKleinste == 2 && frei == 0) {
				stapel[2]--;
				stapel[0]++;
			} else if(zweitKleinste == 2 && frei == 1) {
				stapel[2]--;
				stapel[1]++;
			}
			
			zweitKleinste = frei;
			
			if(kleinste == 0 && zweitKleinste == 2) {
				frei = 1;
			} else if(kleinste == 0 && zweitKleinste == 1) {
				frei = 2;
			} else if(kleinste == 1 && zweitKleinste == 2) {
				frei = 0;
			} else if(kleinste == 1 && zweitKleinste == 0) {
				frei = 2;
			} else if(kleinste == 2 && zweitKleinste == 0) {
				frei = 1;
			} else if(kleinste == 2 && zweitKleinste == 1) {
				frei = 0;
			}
		}
		
		System.out.println("Quelle hat: " + stapel[0] + " Scheiben!");
		System.out.println("Ziel hat: " + stapel[1] + " Scheiben!");
		System.out.println("Hilfsziel hat: " + stapel[2] + " Scheiben!");
	}
	
	public static void main (String args []) {
		tow(3);
	}
}

Ergebnis ist 1 | 2 | 0 und das Programm terminiert nicht
 
P

PfiffPaff

Gast
Also das macht er zur Zeit:

3 | 0 | 0
2 | 1 | 0
1 | 2 | 0

Der dritte Schritt ist mir unverständlich.....
 

bfmn

Mitglied
Hallo PfiffPfaf,

Ich hab deinen Code mal um Ausgaben erweitert und durch den Debugger geschickt.

Was passiert ist:

Quelle hat: 3 Scheiben!
Ziel hat: 0 Scheiben!
Hilfsziel hat: 0 Scheiben!
2 | 1 | 0
1 | 1 | 1
1 | 0 | 2
2 | 0 | 1
3 | 0 | 0
2 | 1 | 0

usw.
Du legst also immer wieder alle Steine zurück auf den stapel[0], was dein Ausgangpunkt ist. Aufjedenfall ist das der Grund wieso dein Programm nicht zu einem Ende kommt, weil die Abbruchbedingung nie erreicht wird. (while(stapel[0] != 0 && stapel[1] != n))

Ich habe noch nicht ganz hinter deine Logik geblickt, würde aber mal beim setzten von kleinste anfangen.
Mir ist nicht ganz klar wieso du den Wert einfach immer um 1 erhöhst und dann zu 0 zurückspringst wenn du 2 erreicht hast.

Leider ist der Akku von meinem Notebook gleich leer, aber viel Glück bei der Fehlersuche.

mfg,
Niko
 
P

PfiffPaff

Gast
Hallo bfmn,

ich mache das nach dem Algorithmus den ich in einer PDF gefunden habe:

– Wiederhole solange, bis der gesamte Stapel auf der Zielstange ist
1. Setzte die kleinste Scheibe auf die Stange rechts von ihr (bzw. die erste Stange)
2. Setzte die zweitkleinste Scheibe auf die einzig mögliche Stange
 
P

PfiffPaff

Gast
Jetzt hab ich gedacht ich hab den Fehler aber leider doch nicht....
dachte das ich das freie Feld immer falsch gesetzt hatte bekomme
nach korrektur des codes aber immernoch die gleiche Ausgabe:

Java:
public class HanoiIt {
	
	static void tow(int n) {
		int[] stapel = {n, 0, 0};
		int kleinste = 0;
		int zweitKleinste = 0;
		
		System.out.println("Quelle hat: " + stapel[0] + " Scheiben!");
		System.out.println("Ziel hat: " + stapel[1] + " Scheiben!");
		System.out.println("Hilfsziel hat: " + stapel[2] + " Scheiben!");
		
		while(stapel[0] != 0 && stapel[1] != n) {
			if(kleinste == 0) {
				stapel[0]--;
				stapel[1]++;
				System.out.println(stapel[0] + " | " + stapel[1] + " | " + stapel[2]);
			} else if(kleinste == 1) {
				stapel[1]--;
				stapel[2]++;
				System.out.println(stapel[0] + " | " + stapel[1] + " | " + stapel[2]);
			} else if(kleinste == 2) {
				stapel[2]--;
				stapel[0]++;
				System.out.println(stapel[0] + " | " + stapel[1] + " | " + stapel[2]);
			}
			
			if(kleinste == 2) {
				kleinste = 0;
			} else {
				kleinste++;
			}
			
			
			if(zweitKleinste == 0 && kleinste == 1) {
				stapel[0]--;
				stapel[2]++;
				zweitKleinste = 2;
				System.out.println(stapel[0] + " | " + stapel[1] + " | " + stapel[2]);
			} else if(zweitKleinste == 0 && kleinste == 2) {
				stapel[0]--;
				stapel[1]++;
				zweitKleinste = 1;
				System.out.println(stapel[0] + " | " + stapel[1] + " | " + stapel[2]);
			} else if(zweitKleinste == 1 && kleinste == 0) {
				stapel[1]--;
				stapel[2]++;
				zweitKleinste = 2;
				System.out.println(stapel[0] + " | " + stapel[1] + " | " + stapel[2]);
			} else if(zweitKleinste == 1 && kleinste == 2) {
				stapel[1]--;
				stapel[0]++;
				zweitKleinste = 0;
				System.out.println(stapel[0] + " | " + stapel[1] + " | " + stapel[2]);
			} else if(zweitKleinste == 2 && kleinste == 0) {
				stapel[2]--;
				stapel[1]++;
				zweitKleinste = 1;
				System.out.println(stapel[0] + " | " + stapel[1] + " | " + stapel[2]);
			} else if(zweitKleinste == 2 && kleinste == 1) {
				stapel[2]--;
				stapel[0]++;
				zweitKleinste = 0;
				System.out.println(stapel[0] + " | " + stapel[1] + " | " + stapel[2]);
			}
		}
		
		System.out.println("Quelle hat: " + stapel[0] + " Scheiben!");
		System.out.println("Ziel hat: " + stapel[1] + " Scheiben!");
		System.out.println("Hilfsziel hat: " + stapel[2] + " Scheiben!");
	}
	
	public static void main (String args []) {
		tow(3);
	}
}

/*
3 | 0 | 0
2 | 1 | 0
1 | 1 | 1
1 | 0 | 2
2 | 0 | 1
2 | 1 | 0
1 | 2 | 0
1 | 1 | 1
2 | 0 | 1
*/
 

Paddelpirat

Bekanntes Mitglied
Der Fehler tritt ja dann hier in dieser Zeile auf:

2 | 1 | 0
1 | 1 | 1
1 | 0 | 2
2 | 0 | 1<--
3 | 0 | 0
2 | 1 | 0

In der markierten Zeile müsstest du wohl merken, dass das die kleinste Scheibe ganz rechts ist und dann die große Scheibe von Stange 1 auf Stange 2 schieben. Dann verschiebst du die kleine Scheibe auf die freie Scheibe und die mittlere Scheibe auf die zweite Stange. Dann wieder die kleine auf die mittlere... fertig.
 
P

PfiffPaff

Gast
Richtig, genau in der Zeile, deshalb weiß ich auch nicht was falsch sein soll...
Denn schließlich ist die größte Scheibe ganz links jetzt die "zweitKleinste" weil
die kleinste ganz Rechts ist, sie wird aber nicht verschoben und ich weiß nicht wieso
 
P

PfiffPaff

Gast
Okay, ich weiß wo der fehler liegt....

der Fehler liegt hier:

Java:
if(kleinste == 2) {
	kleinste = 0;
} else {
	kleinste++;
}

wenn ich die kleinste auf die zweitkleinste lege,
muss ich auch die Position des zweitkleinsten ändern....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
H Quicksort und Rekursiv: Türme von Hanoi Java Basics - Anfänger-Themen 9
wuerg Türme von Hanoi Iterativ Java Basics - Anfänger-Themen 8
S Türme von Hanoi Java Basics - Anfänger-Themen 36
B Türme von Hanoi mit einer beliebigen aber gültigen Eingabe lösen Java Basics - Anfänger-Themen 5
P Hanoi Java Basics - Anfänger-Themen 1
S Rekursion Rückgabe - Türme von Hanoi Java Basics - Anfänger-Themen 16
C Türme von Hanoi - Anzhal der Züge Java Basics - Anfänger-Themen 1
D Türme von Hanoi in "Java ist auch eine Insel" Java Basics - Anfänger-Themen 4
D Türme von hanoi Java Basics - Anfänger-Themen 7
B Türme von Hanoi ausgabe Java Basics - Anfänger-Themen 2
shiroX OOP Türme von Hanoi - einfache grafische Ausgabe Java Basics - Anfänger-Themen 2
T Türme von Hanoi Java Basics - Anfänger-Themen 9
D > 3 Türme von Hanoi Java Basics - Anfänger-Themen 11
J Erste Schritte türme von hanoi verständnisprobleme Java Basics - Anfänger-Themen 6
F Methoden Hanoi - Anzahl der Bewegungen Java Basics - Anfänger-Themen 8
B Türme von Hanoi - Iterator Java Basics - Anfänger-Themen 50
R Türme von Hanoi mit beliebiger Startposition Java Basics - Anfänger-Themen 5
kulturfenster Probleme mit Hanoi Java Basics - Anfänger-Themen 3
G Verständnisproblem Türme von Hanoi Java Basics - Anfänger-Themen 4
B Kann Quellcode von "Hanoi" nicht verstehen. Bitte Java Basics - Anfänger-Themen 4
kulturfenster Hanoi Java Basics - Anfänger-Themen 28
X Türme von Hanoi - Iterativ Java Basics - Anfänger-Themen 8
D Hanoi Java Basics - Anfänger-Themen 6
L Hanoi II : Rekursiviker gesucht Java Basics - Anfänger-Themen 22
B Türme von Hanoi: aktuelle Belegungszustände ausgeben? Java Basics - Anfänger-Themen 2
T Rekursiver Algorithmus: Türme von Hanoi Java Basics - Anfänger-Themen 8
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
L File Tree rekursiv Java Basics - Anfänger-Themen 10
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2
X Addition rekursiv ohne Schleife Java Basics - Anfänger-Themen 10
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
E Datentypen ein java problem rekursiv loesen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben