next up previous contents
Nächste Seite: Weitere Rekursionen... Aufwärts: Funktionen rekursiv verwenden Vorherige Seite: Die Ackermann-Funktion   Inhalt

Die Türme von Hanoi

Die (legendären) Türme von Hanoi bestehen aus durchbohrten Scheiben, die der Größe nach auf Säulen geschlichtet sind. Auf einer Säule befinden sich $n$ Scheiben - sie sollen Stück für Stück auf eine andere Säule umgeschlichtet werden, wobei eine Scheibe immer nur auf einer größeren zu liegen kommen soll. Damit dies möglich ist, können Scheiben zwischenzeitlich auf einer dritten Säule gestapelt werden... Im folgenden Beispiel wird das Umschlichten der Scheiben rekursiv berechnet und Schritt für Schritt ausgegeben:

public class Hanoi {

    static long schritte;

    static void lege(int n, char von, char nach, char zwischen) {
        if (n>0) {
            lege(n-1, von, zwischen, nach);
            System.out.println(n + ". Scheibe von " + von + " nach " + nach);
            lege(n-1,zwischen, nach, von);
            schritte++;
        }
    }

    public static void main(String [] args) {
        int maxzahl = Integer.parseInt(args[0]);
        lege(maxzahl, 'a', 'c', 'b');
        System.out.println("-----------------------------------------");
        System.out.println(schritte + " Schritte");
    }
}

Für einige (kleine) Anzahl von Scheiben erhalten wir:

alfred@duron:~/java/themen> java Hanoi 2
1. Scheibe von a nach b
2. Scheibe von a nach c
1. Scheibe von b nach c
-----------------------------------------
3 Schritte
alfred@duron:~/java/themen> java Hanoi 3
1. Scheibe von a nach c
2. Scheibe von a nach b
1. Scheibe von c nach b
3. Scheibe von a nach c
1. Scheibe von b nach a
2. Scheibe von b nach c
1. Scheibe von a nach c
-----------------------------------------
7 Schritte
alfred@duron:~/java/themen> java Hanoi 4
1. Scheibe von a nach b
2. Scheibe von a nach c
1. Scheibe von b nach c
3. Scheibe von a nach b
1. Scheibe von c nach a
2. Scheibe von c nach b
1. Scheibe von a nach b
4. Scheibe von a nach c
1. Scheibe von b nach c
2. Scheibe von b nach a
1. Scheibe von c nach a
3. Scheibe von b nach c
1. Scheibe von a nach b
2. Scheibe von a nach c
1. Scheibe von b nach c
-----------------------------------------
15 Schritte
alfred@duron:~/java/themen>

Man kann zeigen, dass für $n$ Scheiben $2^n - 1$ Schritte notwendig sind. Wieviele Schritte sind zum Umsetzen von $100$ Scheiben notwendig? Wie lange dauert dafür die Berechnung?



Alfred Nussbaumer 2003-02-10