1 / 42

Rekursion

Rekursion. Klaus Becker (2002). Teil 1. Rekursive Algorithmen. Türme von Hanoi. 1883 hatte der französische Mathematiker Edouard Lucas jene kleine Geschichte ersonnen, die fortan als die Geschichte der Türme von Hanoi selbst Geschichte machte:

Download Presentation

Rekursion

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Rekursion Klaus Becker (2002)

  2. Teil 1 Rekursive Algorithmen

  3. Türme von Hanoi 1883 hatte der französische Mathematiker Edouard Lucas jene kleine Geschichte ersonnen, die fortan als die Geschichte der Türme von Hanoi selbst Geschichte machte: Im Großen Tempel von Benares, unter dem Dom, der die Mitte der Welt markiert, ruht eine Messingplatte, in der drei Diamantnadeln befestigt sind, jede eine Elle hoch und so stark wie der Körper einer Biene. Bei der Erschaffung der Welt hat Gott vierundsechzig Scheiben aus purem Gold auf eine der Nadeln gesteckt, wobei die größte Scheibe auf der Messingplatte ruht, und die übrigen, immer kleiner werdend, eine auf der anderen. Das ist der Turm von Brahma. Tag und Nacht sind die Priester unablässig damit beschäftigt, den festgeschriebenen und unveränderlichen Gesetzen von Brahma folgend, die Scheiben von einer Diamantnadel auf eine andere zu setzen, wobei der oberste Priester nur jeweils eine Scheibe auf einmal umsetzen darf, und zwar so, dass sich nie eine kleinere Scheibe unter einer größeren befindet. Sobald dereinst alle vierundsechzig Scheiben von der Nadel, auf die Gott sie bei der Erschaffung der Welt gesetzt hat, auf eine der anderen Nadeln gebracht sein werden, werden der Turm samt dem Tempel und allen Brahmanen zu Staub zerfallen, und die Welt wird mit einem Donnerschlag untergehen.

  4. Türme von Hanoi A B C Aufgabe: Versuchen Sie, 4 (einfach) bzw. 5 oder 6 (schwieriger) Scheiben von Platz A nach Platz C nach den Regeln der Priester von Benares zu bringen. Benutzen Sie das Simulationsprogramm „Hanoi“. Wenn Sie es geschafft haben, überlegen Sie sich, wie lang es dauert, einen Turm aus 64 Scheiben umzubauen, wenn man 1 Sekunde benötigt, um eine Scheibe zu bewegen.

  5. Problembeschreibung AZ: A B C Bringe n-Stapel von A über B nach C ZZ: A B C

  6. Lösungsidee AZ: A C B ... A C B ... A C B ZZ: A C B

  7. Struktur der Lösungsidee A C B Bringe (n-1)-Stapel von A über C nach B A C B Bringe Scheibe von A nach C A C B Bringe (n-1)-Stapel von B über A nach C A C B

  8. Rekursive Problemreduktion Problem: Bringe n-Stapel von A über B nach C Lösung: Bringe (n-1)-Stapel von A über C nach B Bringe Scheibe von A nach C Bringe (n-1)-Stapel von B über A nach C Beachte: Die Lösung reduziert das Problem auf ein strukturgleiches Problem in verkleinerter Form (rekursive Problemreduktion).

  9. Rekursiver Algorithmus Algorithmus Bringe n-Stapel von X über Y nach Z wenn n> 1 dann Bringe (n-1)-Stapel von X über Z nach Y Bringe Scheibe von X nach Z Bringe (n-1)-Stapel von Y über X nach Z sonst Bringe Scheibe von X nach Z Beachte: Der Algorithmus ruft sich selbst auf, er ist infolgedessen rekursiv.

  10. Rekursiver Algorithmus Algorithmus Hanoi(n: integer; X, ,Y, Z: char) wenn n> 1 dann Hanoi(n-1, X,Z,Y) Bringe Scheibe von X nach Z Hanoi(n-1, Y, X, Z) sonst Bringe Scheibe von X nach Z Beachte: Der Algorithmus ruft sich selbst auf, er ist infolgedessen rekursiv.

  11. Abarbeitung rekursiver Algorithmen Hanoi(3, A, B, C) Hanoi(2, A, C, B) Hanoi(1, A, B, C) Bringe Scheibe von A nach C Bringe Scheibe von A nach B Hanoi(1, C, A, B) Bringe Scheibe von C nach B Bringe Scheibe von A nach C Hanoi(2, B, A, C) Hanoi(1, B, C, A) Bringe Scheibe von B nach A Bringe Scheibe von B nach C Hanoi(1, A, B, C) Bringe Scheibe von A nach C ALG. Hanoi(n: integer; X, ,Y, Z: char) WENN n> 1 DANN Hanoi(n-1, X,Z,Y) Bringe Scheibe von X nach Z Hanoi(n-1, Y, X, Z) SONST Bringe Scheibe von X nach Z Wiederholte Ausführung des Algorithmus, bis die Abbruchbedingung erfüllt ist.

  12. Übung ALG. Hanoi(n: integer; X, ,Y, Z: char) WENN n> 1 DANN Hanoi(n-1, X,Z,Y) Bringe Scheibe von X nach Z Hanoi(n-1, Y, X, Z) SONST Bringe Scheibe von X nach Z Sie sollen einen Turm mit 4 Scheiben umschichten. Gehen Sie dabei nach dem entwickelten rekursiven Algorithmus vor. Notieren Sie sich zunächst sämtliche Scheibenbewegungen. Testen Sie sie anschließend mit dem Simulationsprogramm.

  13. Zusammenfassung Entwurf: Ausführung: Muss vom Entwickler geleistet werden. Wird vom System übernommen. Hanoi(3, A, B, C) Hanoi(2, A, C, B) Hanoi(1, A, B, C) Bringe Scheibe von A nach C Bringe Scheibe von A nach B Hanoi(1, C, A, B) Bringe Scheibe von C nach B Bringe Scheibe von A nach C Hanoi(2, B, A, C) Hanoi(1, B, C, A) Bringe Scheibe von B nach A Bringe Scheibe von B nach C Hanoi(1, A, B, C) Bringe Scheibe von A nach C ALG. Hanoi(n: integer; X, ,Y, Z: char) WENN n> 1 DANN Hanoi(n-1, X,Z,Y) Bringe Scheibe von X nach Z Hanoi(n-1, Y, X, Z) SONST Bringe Scheibe von X nach Z Entwurfsstrategie: Reduziere das Problem auf ein strukturgleiches Problem in „verkleinerter Form“, sofern das Problem nicht direkt lösbar ist.

  14. Quicksort Eine Reihung von Zahlen / ... soll der Größe nach sortiert werden. AZ: Zahlen: 27 13 80 82 6 44 26 15 16 39 90 53 anfang ende Quicksort(anfang, ende) ZZ: Zahlen: 6 13 15 16 26 27 39 44 53 80 82 90 anfang ende

  15. Quicksort ALGORITHMUS Quicksort(anfang, ende: tIndex) links := anfang; rechts := ende; Zahlen: 27 13 80 82 6 44 26 15 16 39 90 53 anfang ende links rechts zerlege(links, rechts) p Zahlen: 27 13 39 16 6 15 26 44 82 80 90 53 anfang rechts links ende WENN anfang < rechts Quicksort(anfang, rechts) Zahlen: 6 13 15 16 26 27 39 44 82 80 90 53 anfang rechts links ende WENN links < ende Quicksort(links, ende) Zahlen: 6 13 15 16 26 27 39 44 53 80 82 90 anfang rechts links ende

  16. Quicksort Entwurfsstrategie: Reduziere das Problem auf ein strukturgleiches Problem in „verkleinerter Form“, sofern das Problem nicht direkt lösbar ist. ALGORITHMUS Quicksort(anfang, ende: tIndex) links := anfang; rechts := ende; Vorbereitung zerlege(links, rechts); WENN anfang < rechts Quicksort(anfang, rechts); Rekursive Reduktions-schritte WENN links < ende Quicksort(links, ende); Abbruch-bedingung Bemerkung: Kurzer Algorithmus, der einen komplexen Ablauf festlegt.

  17. Teil 2 Turtle-Grafik

  18. Turtle-Grafik Die Turtle lebt auf einer Zeichenfläche. Die Turtle kann sich bewegen, drehen und – zum Zeichnen – eine Spur hinterlassen. Zeichen-fläche Turtlespur Turtle

  19. Turtle-Grafik Die Turtle agiert auf Befehle / führt Anweisungen aus. Draw(100)

  20. Turtle-Grafik Die Turtle kann „neue Befehle“ lernen. Diese werden in Turtle-Programmen festgelegt. Quadrat procedure Quadrat;beginwith Turtle do begin Draw(100); Turn(90); Draw(100); Turn(90); Draw(100); Turn(90); Draw(100); Turn(90);end;end;

  21. Die Turtle als Objekt Die Turtle wird als ein Objekt der Klasse TTurtle erzeugt. Sie besitzt infolgedessen charakteristische Eigenschaften ( Attribute) und kann charakteristische Operationen ausführen ( Methoden). (0|0) (688|0) TTurtle Attribute XPos : double // x-Position YPos : double // y-Position Angle : double // Richtung Color : TColor // Zeichenfarbe ... Ereignisse ... Methoden ... Turtle (0|452) (688|452)

  22. Die Turtle als Objekt TTurtle Attribute ... Ereignisse ... Methoden Init // Die Turtle wird in die Mitte der Zeichenfläche mit Blickrichtung nach rechts gesetzt. Draw(d: double) // Die Turtle zeichnet in der aktuell. Blickrichtung eine Strecke der Länge d. DrawTo(x,y: double) // Die Turtle zeichnet eine Strecke zum Punkt (x|y). Turn(a: double) //Die Turtle dreht sich um den Winkel a (a > 0: Linksdr.; a < 0: Rechtsdr.). TurnTo(a: double) // Die Turtle setzt ihre Blickricht. nach a (a = 0: rechts; a = 90: oben; ...). Move(d: double) // Die Turtle bewegt sich – ohne zu zeichnen – um d in Blickrichtung. MoveTo(x,y: double) // Die Turtle bewegt sich – ohne zu zeichnen – zum Punkt (x|y). Clear // Die Zeichenfläche der Turtle wird gelöscht. ...

  23. Zeichnen mit der Turtle AZ: procedure Quadrat(x: real); var i: integer; beginfor i := 1 to 4 do begin Turtle.Draw(x); Turtle.Turn(90); end;end; Al: Quadrat(200); ZZ:

  24. Zeichnen mit der Turtle AZ: procedure Quadrat(x: real); var i: integer; beginwith Turtle do begin for i := 1 to 4 do begin Draw(x); Turn(90); end; end;end; Al: Quadrat(200); ZZ: Quadrat

  25. Übungen Entwickeln Sie ein Turtle-Programm, mit dem man einen (primitiven) Tannenbaum zeichnen kann. Gehen Sie wie folgt vor: Überlegen Sie sich zunächst, aus welchen Bestandteilen der Tannenbaum besteht. Formulieren Sie anschließend die Algorithmen für die Bestandteile. Implementieren und testen Sie die Algorithmen abschließend mit Hilfe der Turtle-Komponente.

  26. Übungen Entwickeln Sie ein Turtle-Programm, mit dem man einen Quadratturm (beliebiger) Höhe zeichnen kann. Formulieren Sie zunächst die benutzten Algorithmen. Implementieren und testen Sie die Algorithmen abschließend mit Hilfe der Turtle-Komponente.

  27. Teil 3 Selbstähnliche Figuren

  28. Selbstähnlichkeit

  29. Selbstähnlichkeit Eine Figur ist selbstähnlich, wenn sie sich in Teile zerlegen lässt, die zur ihr ähnlich sind.

  30. Rekursive Problemreduktion Rekursive Problemreduktion: Baum(200) Baum(200) Turtle.Draw(200); Turtle.Turn(45); Baum(100); Turtle.Turn(-90); Baum(100); Turtle.Turn(45); Turtle.Move(-200); Baum(100) Baum(100) Trivialer Fall: Draw(200) Baum(x) // falls x < 2 // keine Operationen

  31. Rekursiver Algorithmus Algorithmus Baum(Stamm: real) WENN Stamm >= 2 DANN Turtle.Draw(Stamm); Turtle.Turn(45); Baum(Stamm/2); Turtle.Turn(-90); Baum(Stamm/2); TurtleTurn(45); Turtle.Move(-Stamm);

  32. Übungen Suchen Sie sich auf den folgenden Seiten eine selbstähnliche Figur aus und entwickeln Sie für diese ein Turtle-Zeichenprogramm. Gehen Sie wie folgt vor: Machen Sie sich (exemplarisch) einen rekursiven Problemreduktionsschritt klar. Überlegen Sie sich, was im trivialen Fall erfolgen soll (nichts / ...). Formulieren Sie einen rekursiven Algorithmus und implementieren ihn mit Hilfe der Turtle-Komponente.

  33. Schachtelhalm

  34. Busch

  35. Teufelsgabel

  36. Treppe ins Nirgendwo

  37. Quadratpflanze

  38. Sierpinski-Dreieck

  39. Pythagoras-Baum

  40. Farn

  41. Koch-Kurve

  42. Variationen der Koch-Kurve

More Related