Presentation is loading. Please wait.

Presentation is loading. Please wait.

Die Türme von Hanoi Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik © Timm Grams, Fulda, 21.11.02.

Similar presentations


Presentation on theme: "Die Türme von Hanoi Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik © Timm Grams, Fulda, 21.11.02."— Presentation transcript:

1 Die Türme von Hanoi Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik © Timm Grams, Fulda,

2 Die Türme von Hanoi - Das Problem Gegeben seien drei Pflöcke, die wir mit A, B und C bezeichnen. Zu Beginn stecken auf Pflock A genau n Scheiben. Die Scheiben werden von unten nach oben immer kleiner. Folgende Grundregel ist während des ganzen Spiels einzuhalten: Scheiben werden grundsätzlich auf Pflöcke gesteckt und nie daneben gelegt, und außerdem darf nie eine Scheibe auf einer kleineren liegen. Die Aufgabe lautet, die Scheiben - unter Beachtung der Regel - von Pflock A nach Pflock B zu transportieren.

3 Die Türme von Hanoi ABC

4 Die Türme von Hanoi - Programmidee Die Aufgabe, n Scheiben vom Quellturm zum Zielturm zu transportieren, führt man auf die wohl etwas einfachere Aufgabe für n-1 Scheiben zurück. Also: Man bringt die n-1 obersten Scheiben vom Ziel- auf den Hilfsturm, dann legt man die unterste Scheibe auf den Zielturm und anschließend werden die n-1 Scheiben vom Hilfsturm auf den Zielturm transportiert. Das Problem für n-1 Scheiben behandelt man nun genau so. Man führt es zurück auf den Transport von n-2 Scheiben. Und so weiter. Bis man nur noch eine Scheibe transportieren muss.

5 Die Türme von Hanoi - Programm /*A, B, C: Quell-, Ziel und Hilfsturm*/ void move(char A, char B, char C, int n){ if(n>1) move(A, C, B, n-1); if(n>1) move(A, C, B, n-1); printf("%5d:%c ---> %c\n", n, A, B); printf("%5d:%c ---> %c\n", n, A, B); if (n>1) move(C, B, A, n-1); if (n>1) move(C, B, A, n-1);} void main(){ int n; int n; printf("DIE TUERME VON HANOI\n"); printf("DIE TUERME VON HANOI\n"); printf("? Anzahl Scheiben = "); printf("? Anzahl Scheiben = "); scanf("%d", &n); scanf("%d", &n); move('A', 'B', 'C', n); move('A', 'B', 'C', n);}

6 Zur Visualisierung des Ablaufs Aufbau der folgenden Folien Programmspeicher(Ausschnitt) Befehlszähler(Program Counter, PC) Stapelspeicher (Stack) Für jeden Funktionsaufruf wird ein Funktions- segment (Activation Record) angelegt. Es wird als ein Blatt Papier visualisiert, das auf die bereits daliegenden Papiere gelegt wird. Es enthält die automatischen Variablen für die Parameter und die Rücksprungadresse (RA). Nach Beendigung der Funktion wird der Befehlszähler auf den Wert der Rücksprung- adresse (Return Address, RA) gesetzt und das Segment wird vom Stack entfernt. Die Türme

7 Ablauf Nach Eingabe der Zahl 3 erfolgt im Hauptprogramm der Funktionsaufruf "move('A', 'B', 'C', 3);". Das ergibt die folgende Situation. (Das zuunterst liegende Funktionssegment für das Hauptprogramm ist weggelassen worden. Der weitere Fortgang ist dem Wert des Befehlszählers zu entnehmen.) Befehlszähler(Program Counter, PC) Die Türme Programmspeicher(Ausschnitt)

8 Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:} A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 1 A: 'A' B: 'C' C: 'B' n: 2 RA: 2 A: 'A' B: 'B' C: 'C' n: 1 RA: 2

9 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 2 A: 'A' B: 'C' C: 'B' n: 2 RA: 2 A: 'A' B: 'B' C: 'C' n: 1 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

10 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 3 A: 'A' B: 'C' C: 'B' n: 2 RA: 2 A: 'A' B: 'B' C: 'C' n: 1 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

11 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 4 A: 'A' B: 'C' C: 'B' n: 2 RA: 2 A: 'A' B: 'B' C: 'C' n: 1 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

12 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 2 A: 'A' B: 'C' C: 'B' n: 2 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

13 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 3 A: 'A' B: 'C' C: 'B' n: 2 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

14 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 1 A: 'A' B: 'C' C: 'B' n: 2 RA: 2 A: 'B' B: 'C' C: 'A' n: 1 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

15 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 2 A: 'A' B: 'C' C: 'B' n: 2 RA: 2 A: 'B' B: 'C' C: 'A' n: 1 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

16 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 3 A: 'A' B: 'C' C: 'B' n: 2 RA: 2 A: 'B' B: 'C' C: 'A' n: 1 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

17 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 4 A: 'A' B: 'C' C: 'B' n: 2 RA: 2 A: 'B' B: 'C' C: 'A' n: 1 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

18 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 4 A: 'A' B: 'C' C: 'B' n: 2 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

19 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 2 Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

20 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 3 Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

21 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 1 A: 'C' B: 'B' C: 'A' n: 2 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

22 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 1 A: 'C' B: 'B' C: 'A' n: 2 RA: 4 A: 'C' B: 'A' C: 'B' n: 1 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

23 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 2 A: 'C' B: 'B' C: 'A' n: 2 RA: 4 A: 'C' B: 'A' C: 'B' n: 1 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

24 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 3 A: 'C' B: 'B' C: 'A' n: 2 RA: 4 A: 'C' B: 'A' C: 'B' n: 1 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

25 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 4 A: 'C' B: 'B' C: 'A' n: 2 RA: 4 A: 'C' B: 'A' C: 'B' n: 1 RA: 2Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

26 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 2 A: 'C' B: 'B' C: 'A' n: 2 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

27 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 3 A: 'C' B: 'B' C: 'A' n: 2 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

28 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 1 A: 'C' B: 'B' C: 'A' n: 2 RA: 4 A: 'A' B: 'B' C: 'C' n: 1 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

29 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 2 A: 'C' B: 'B' C: 'A' n: 2 RA: 4 A: 'A' B: 'B' C: 'C' n: 1 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

30 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 3 A: 'C' B: 'B' C: 'A' n: 2 RA: 4 A: 'A' B: 'B' C: 'C' n: 1 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

31 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 4 A: 'C' B: 'B' C: 'A' n: 2 RA: 4 A: 'A' B: 'B' C: 'C' n: 1 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

32 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 4 A: 'C' B: 'B' C: 'A' n: 2 RA: 4Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

33 A B C A: 'A' B: 'B' C: 'C' n: 3 RA: STOP PC: 4 Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:}

34 A B C PC: STOP Ablauf void move(char A, char B, char C, int n){ 1: if(n>1) move(A, C, B, n-1); 1: if(n>1) move(A, C, B, n-1); 2: printf("%5d:%c ---> %c\n", n, A, B); 2: printf("%5d:%c ---> %c\n", n, A, B); 3: if (n>1) move(C, B, A, n-1); 3: if (n>1) move(C, B, A, n-1); 4: 4:} Das war's

35 So sieht die Sache jetzt aus ABC

36 Ende des Foliensatzes


Download ppt "Die Türme von Hanoi Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik © Timm Grams, Fulda, 21.11.02."

Similar presentations


Ads by Google