Erste Schritte türme von hanoi verständnisprobleme

javaman123

Neues Mitglied
Java:
class TowerOfHanoi 
{ 
  static void move( int n, 
                    String fromPeg, String toPeg, String usingPeg ) 
  { 
    if ( n > 1 ) 
    { 
      move( n – 1, fromPeg, usingPeg, toPeg ); 
      System.out.printf( "Bewege Scheibe %d von der %s zur %s.%n", 
                         n, fromPeg, toPeg ); 
      move( n – 1, usingPeg, toPeg, fromPeg ); 
    } 
    else 
      System.out.printf( "Bewege Scheibe %d von der %s zur %s.%n", 
                         n, fromPeg, toPeg ); 
  } 
 
  public static void main( String[] args ) 
  { 
    move( 4, "Kupfersäule", "Silbersäule", "Goldsäule" ); 
  } 
}

Ausgabe:

Code:
Bewege Scheibe 1 von der Kupfersäule zur Goldsäule. 
Bewege Scheibe 2 von der Kupfersäule zur Silbersäule. 
Bewege Scheibe 1 von der Goldsäule zur Silbersäule. 
Bewege Scheibe 3 von der Kupfersäule zur Goldsäule. 
Bewege Scheibe 1 von der Silbersäule zur Kupfersäule. 
Bewege Scheibe 2 von der Silbersäule zur Goldsäule. 
Bewege Scheibe 1 von der Kupfersäule zur Goldsäule. 
Bewege Scheibe 4 von der Kupfersäule zur Silbersäule. 
Bewege Scheibe 1 von der Goldsäule zur Silbersäule. 
Bewege Scheibe 2 von der Goldsäule zur Kupfersäule. 
Bewege Scheibe 1 von der Silbersäule zur Kupfersäule. 
Bewege Scheibe 3 von der Goldsäule zur Silbersäule. 
Bewege Scheibe 1 von der Kupfersäule zur Goldsäule. 
Bewege Scheibe 2 von der Kupfersäule zur Silbersäule. 
Bewege Scheibe 1 von der Goldsäule zur Silbersäule.

Ich versteh den Code nicht so recht, leider ist es im Buch nicht erklärt.
Könnt ihr mir helfen?

Danke schon mal!

LG
 
Bei den Türmen von Hanoi geht es darum n Scheiben von einer Säule zur anderen zu bewegen, wobei du eine Scheibe nur auf eine größere Scheibe legen darfst.

Du hast drei Stapel, einen Startstapel, einen Zielstapel und einen Hilfsstapel. Wenn du nun n Scheiben von Start nach Ziel verschieben willst, gehst du wei folgt vor:
Falls n = 1 ist, kannst du die Scheibe direkt auf den Stapel packen. Das ist beim else Fall in Zeile 14 abgefangen. Ansonsten verschiebe erst n-1 Scheiben vom Starstapel auf den Hilfsstapel (Zeilen 8 und 9), um dann die unterste Scheibe vom Startstapel auf den Zielstapel zu schieben (Zeile 11).

Mach dir das am besten klar, indem du das im Kopf oder auf Papier mit 3-4 Scheiben durchspielst 🙂
 
Danke für deine Antwort.

Was ich nicht verstehe wo kommt die Zahl 1 und alle weiteren Nummern der Scheiben her?
Code:
Bewege Scheibe 1 von der Kupfersäule zur Goldsäule. 
Bewege Scheibe 2 von der Kupfersäule zur Silbersäule. 
Bewege Scheibe 1 von der Goldsäule zur Silbersäule. 
Bewege Scheibe 3 von der Kupfersäule zur Goldsäule. 
Bewege Scheibe 1 von der Silbersäule zur Kupfersäule. 
Bewege Scheibe 2 von der Silbersäule zur Goldsäule. 
Bewege Scheibe 1 von der Kupfersäule zur Goldsäule. 
Bewege Scheibe 4 von der Kupfersäule zur Silbersäule. 
Bewege Scheibe 1 von der Goldsäule zur Silbersäule. 
Bewege Scheibe 2 von der Goldsäule zur Kupfersäule. 
Bewege Scheibe 1 von der Silbersäule zur Kupfersäule. 
Bewege Scheibe 3 von der Goldsäule zur Silbersäule. 
Bewege Scheibe 1 von der Kupfersäule zur Goldsäule. 
Bewege Scheibe 2 von der Kupfersäule zur Silbersäule. 
Bewege Scheibe 1 von der Goldsäule zur Silbersäule.
 
das ist doch offensichtlich der Parameter n der Methode? wenn du das nicht im Code siehst, dann ist es ja wirklich kritisch..,

von der main-Methode kommt die 4 rein, die wird auch ausgegeben, aber nicht als erstes,
durch rekursive Aufrufe kommen vorher andere Zahlen ran, n-1 usw.
 
also ich checks auch nicht.
bei einer geraden anzahl scheiben fängt er an mit "links nach mitte"
bei ungeraden mit "links nach rechts". ich verstehe nicht wann das programm entscheidet wo es anfangen soll.

woher weiss mein programm seinen start- und seinen ziel-stapel?
wo bzw. wann wird links, mitte und rechts vertauscht?

kann mir jemand helfen?




Java:
public class Hanoi 
{

	static void ausgabe( int n, String von, String nach )
	{
		System.out.printf( "Scheibe %d von %s nach %s%n", n, von, nach );
	}
	static void versetzeTurm( int n, String links, String mitte, String rechts )
	{
		if ( n > 1 )
		{
			versetzeTurm( n-1, links, rechts, mitte );
			ausgabe( n, links, rechts );
			versetzeTurm( n-1, mitte, links, rechts );
		}
		else
			ausgabe( n, links, rechts );
	}
	public static void main( String[] args )
	{
		versetzeTurm( 4, "Links", "Mitte", "Rechts" );
	}
}
 
feste Posititonen und gerade/ ungerade kennt und nutzt der Algorithmus nicht,
wichtig ist die Unterscheidung von + nach + dritte Position, die in den Parametern gegeben ist,
und vom initialen Aufruf für den ganzen Ablauf bestimmt ist


die dritte Position wird als Zwischenhalt genutzt:
wenn man von A nach C 5 Scheiden verschieben will, lädt man erstmal 4 auf die dritte Position, in diesem Fall B, das verrät der Parameter,

der Witz ist, dass durch die Rekursion die Rollen tauschen,
um diese 4 Scheiben von A nach B zu bekommen verwendet man das eigentliche Ziel, C,
erstmal als dritte Zwischen-Position für den Transport von A nach B

usw. beliebig verquirrlt, aber kommt am Ende hin, egal mit wieviel Scheiben, dauert nur länger,
Beispiel auf Papier bzw. mit echten Scheiben/ Klötzchen anschauen hilft
 

Neue Themen


Zurück
Oben