Echte und endständige Rekursionen

Aus ProgrammingWiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Rekursionsarten

Echte Rekursion Endständige Rekursion

Eine Prozedur heißt echt rekursiv, wenn das Ergebnis erst im rekursiven Aufstieg ermittelt wird.
Dazu müssen alle aktuellen Wertbindungen vor jedem neuen rekursiven Aufruf gespeichert werden (Stapel / Stack), damit sie im rekursiven Aufstieg zur Verfügung stehen.

Eine Prozedur heißt endständig rekursiv, wenn das Ergebnis bereits nach dem rekursiven Abstieg feststeht.
Häufig wird das aktuelle Ergebnis in einer zusätzlichen Akkumulatorvariablen mitgeführt. Die aufwändige Stapelverwaltung entfällt.
Endständige Rekursionen bezeichnet man deshalb auch als Iterationen.

Beispiel:

Trace-Modus:

Beispiel:

Trace-Modus:

Trichtermodell der internen Abläufe:

Echte Rekursion1.gif

Trichtermodell der internen Abläufe:

Endständige Rekursion1.gif

Hinweis: Für den Trace-Modus in DrRacket muss zunächst das entsprechende Modul eingebunden werden. Zur Aktivierung wird anschließend die zu untersuchende Prozedur der trace-Prozedur übergeben. Die Deaktivierung erfolgt über untrace:

(require racket/trace)
(trace fak)
(fak 6)
(untrace fak)

Beachte: Die mitunter effizientere endständige Rekursion darf zu keinen Zwängen bei der rekursiven Beschreibung von Problemlösungen führen!

Vorüberlegung: Das Sprachelement let

Wir haben bereits lokale Wertbindungen beim Entwickeln allgemeiner zufällige Kfz-Kennzeichen mit dem Sprachelement let genutzt. Bei der Auswertung zufälliger Ereignisse wird es auch hier sehr nützlich sein, z.B.:

Hinweis: Mit lokalen Wertbindungen lassen sich unerwünschte Seiteneffekte in der globalen Scheme-Umgebung vermeiden.

Aufgaben

  1. Quadratzahlen

    Eine Liste mit $n$ Quadratzahlen soll generiert werden.
    Geben Sie eine echt rekursive Lösung an.

     

    Quelltext überprüfen:

    Implementieren Sie nun die endständig rekursive Prozedur.

     

    Quelltext überprüfen:

  2. Glücksrad

    Bei den Prozeduren mit Zeichenketten und Listen haben Sie die Prozedur (random <max>) mit $0 \le z < max$ kennen gelernt.
    Simulieren Sie mit dieser Prozedur ein Glücksrad, das aus 3 blauen, 4 gelben und 5 roten Feldern besteht.
    Implementieren Sie dazu eine nullstellige Prozedur, die einem einmaligen Drehen dieses Glücksrades entspricht und die entsprechende Farbe als Symbol zurückgibt.

     

    Quelltext überprüfen:

    Kommerzielles mehrfarbiges Glücksrad

    Um die Verteilung der Farben zu ermitteln, soll nun das Glücksrad mehrfach gedreht werden.
    Mit der nachfolgenden echt rekursiven Prozedur wird dieser Vorgang simuliert:

    Entwickeln Sie eine endständig rekursive Prozedur, die das Gleiche leistet.

     

    Quelltext überprüfen:

  3. Turm von Hanoi

    Vermutlich stammt dieses Spiel von dem französischen Mathematiker Édouard Lucas (* 4. April 1842; † 3. Oktober 1891), bei dem ein Turm aus einzelnen Scheiben von $A$ nach $B$ unter Nutzung des Hilfsplatzes $H$ umgesetzt werden soll. Dabei darf immer nur eine Scheibe bewegt werden. Außerdem darf nie eine größere Scheibe auf einer kleineren liegen.

    Lucas dachte sich dazu die Geschichte aus, dass indische Mönche im großen Tempel zu Benares, im Mittelpunkt der Welt, einen Turm aus 64 goldenen Scheiben versetzen müssten.
    Wenn ihnen das gelungen sei, wäre das Ende der Welt gekommen.

    Turm von Hanoi

    Gegeben sei folgende Implementation:

    Hinweis: Testen Sie die Prozedur mit kleinen Argumenten!

    • Beschreiben Sie die Spielstrategie (d.h. den Lösungsalgorithmus) verbal.
    • Entscheiden Sie, ob eine echt rekursive oder endständig rekursive Prozedur vorliegt.
    • Ermitteln Sie, welcher Zusammenhang zwischen der Anzahl der Scheiben und der Anzahl der erforderlichen Bewegungen besteht.
    • In wie vielen Jahren "droht" das Ende der Welt, wenn die indischen Mönche im Tempel zu Benares für die Bewegung jeder einzelnen Scheibe eine Sekunde benötigen würden?
    Turm von Hanoi mit 3 Scheiben

Zum Weiterarbeiten

Der zerbrochene Stab

Ein Stab mit der Länge von einem Meter fällt vom Tisch und zerbricht millimetergenau in höchstens drei Teile.
Mit welcher Wahrscheinlichkeit lässt sich aus den Bruchstücken ein Dreieck legen?
Simulieren Sie diesen Vorgang in jeweils einer echtrekursiven bzw. endständig rekursiven Prozedur.

Zur Problemlösung.

Persönliche Werkzeuge