Rekursion ist der Prozess der Definition eines Problems (oder die Lösung für ein Problem) in Bezug auf (eine einfachere Version) selbst.

Zum Beispiel können wir die Operation „find your way home“ definieren als:

  1. Wenn Sie zu Hause sind, hören Sie auf, sich zu bewegen.

  2. machen Sie einen Schritt in Richtung Heimat.

  3. „Ihren Weg nach Hause finden“.

Hier ist die Lösung, um Ihren Weg nach Hause zu finden, zwei Schritte (drei Schritte). Erstens gehen wir nicht nach Hause, wenn wir bereits zu Hause sind., Zweitens machen wir eine sehr einfache Aktion, die unsere Situation einfacher zu lösen macht. Schließlich wiederholen wir den gesamten Algorithmus.

Das obige Beispiel wird als Schwanzrekursion bezeichnet. Hier ruft die allerletzte Anweisung den rekursiven Algorithmus auf. Tail-Rekursion kann direkt in Schleifen übersetzt werden.

Wie würden Sie einen rekursiven „Algorithmus“ schreiben, um ein Quadrat zu finden?

Ein weiteres Beispiel für eine Rekursion wäre das Finden des Maximalwerts in einer Liste von Zahlen. Der Maximalwert in einer Liste ist entweder die erste Zahl oder die größte der verbleibenden Zahlen., Hier ist, wie wir den Pseudocode des Algorithmus schreiben würden:

Teile eines rekursiven Algorithmus

Alle rekursiven Algorithmen müssen Folgendes haben:

  1. Basisfall (dh wann zu stoppen)

  2. Arbeiten Sie in Richtung Basisfall

  3. Rekursiver Aufruf (dh rufen Sie uns selbst auf)

Der „arbeiten Sie in Richtung Basisfall“ ist, wo wir das Problem einfacher machen (zB Liste in zwei Teile teilen, jeder kleiner als das Original). Beim rekursiven Aufruf verwenden wir denselben Algorithmus, um eine einfachere Version des Problems zu lösen., Der Basisfall ist die Lösung für das“ einfachste “ mögliche Problem (Zum Beispiel wäre der Basisfall im Problem ‚Finde die größte Zahl in einer Liste‘, wenn die Liste nur eine Nummer hätte… und per Definition, wenn es nur eine Zahl gibt, ist es die größte).

Einfaches Beispiel: Drei Zahlen hinzufügen

Das Hinzufügen von drei Zahlen entspricht dem Hinzufügen der ersten beiden Zahlen und dem erneuten Hinzufügen dieser beiden Zahlen.

(Beachten Sie, dass in Matlab eine Funktion ohne alle Argumente aufgerufen werden kann. Der nargin Funktion teilt dem computer mit, wie viele Werte angegeben wurden., Somit hätte add_numbers(1) einen Nargin von 1; add_numbers(1,1) hätte einen Nargin von 2; add_numbers (1,1,1) hätte einen Nargin von 3.)

Identifizieren Sie die 3 Teile des rekursiven Algorithmus:

Alle rekursiven Algorithmus muss die folgenden drei Stufen:

Warum Rekursion funktioniert

In einem rekursiven Algorithmus „merkt“ sich der Computer jeden vorherigen Zustand des Problems. Diese Informationen werden vom Computer auf dem „Aktivierungsstapel“ (d. H. Innerhalb jedes Funktionsarbeitsbereichs) „gespeichert“.

Jede Funktion hat einen eigenen Arbeitsbereich PRO AUFRUF der Funktion.,

Labyrinth Beispiel:

Betrachten Sie ein rechteckiges Raster von Räumen, in denen jedes Zimmer Türen auf der Nord -, Süd -, Ost-und Westseite haben kann oder nicht.

Wie finden Sie Ihren Weg aus einem Labyrinth? Hier ist ein möglicher „Algorithmus“, um die Antwort zu finden:

Wenn die Tür für jede Tür im aktuellen Raum zum Ausgang führt, nehmen Sie diese Tür.

Der „Trick“ hier ist natürlich, woher wissen wir, ob die Tür zu einem Raum führt, der zum Ausgang führt? Die Antwort ist, dass wir es nicht tun, aber wir können den Computer es für uns herausfinden lassen.

Was ist der rekursive Teil des obigen Algorithmus?, Es ist die „Tür führt aus dem Labyrinth“. Woher wissen wir, ob eine Tür aus dem Labyrinth führt? Wir wissen, weil wir im nächsten Raum (durch die Tür gehen) die gleiche Frage stellen: Wie kommen wir aus dem Labyrinth?

Was passiert, ist der Computer „erinnert“ alle „was wäre wenn“. Was ist, wenn ich die erste Tür nehme, was ist, wenn ich die zweite Tür nehme, was ist, wenn ich die nächste Tür nehme usw. Und für jede mögliche Tür, durch die Sie sich bewegen können, erinnert sich der Computer an diejenigen, was passiert, und für jede Tür danach und danach usw., bis das Ende gefunden ist.

Hier ist eine nahezu tatsächliche Codimplementierung.,

Frage: Was ist der obige Basisfall?

Antwort: (Das war eine Trickfrage) Es gibt keinen Basisfall im Code. Sie müssen zu Beginn überprüfen, ob der Raum der Ausgang ist. Wenn ja, keine Rekursion!

  function success = find_way_out( maze, room ) if room is exit → return true room ← mark as visited % rest of code ... end  

Frage: Wie markieren Sie den Raum als besucht?

Antwort: Es gibt verschiedene Techniken. Wenn der Raum eine Struktur (oder ein Objekt)ist, können Sie dem Raum die gewünschte Feldrichtung hinzufügen. (z. B. Raum.besucht = true; -) Wenn Sie sind nicht mit Objekten, die Sie könnte haben eine matrix von booleschen flags, das ist die gleiche Größe/Form wie das Labyrinth und diese Werte verwenden.,

Frage: Sind die anderen Probleme mit dem obigen Algorithmus?

Antwort: Die Antwort darauf finden Sie, indem Sie über die folgende Frage nachdenken: Was würde passieren, wenn das Labyrinth ein riesiges Gitter aus gleich großen rechteckigen Räumen mit jeweils Türen an jeder Wand wäre? Stellen Sie sich vor, Sie gehen durch die erste Tür nach Norden, dann nach Osten durch die nächste Zimmertür, dann nach Süden durch diese Zimmertür und dann nach Westen durch diese Zimmertür. Wo enden Sie? Zurück, wo du angefangen hast! Schlimmer noch, Sie könnten diese Schleife für immer fortsetzen. Wie würde ein unerschrockener Abenteurer dieses Problem lösen?,

Eine Antwort darauf besteht darin, ein Stück Kreide zu verwenden und ein großes X auf den Boden jedes Raumes zu legen, den Sie betreten. Wenn Sie also in einen Raum mit einem X auf dem Boden zurückkehren, wissen Sie, dass Sie nicht eintreten müssen. Im Falle des Programms sollte ein boolesches Flag „gesehen“ oder „besucht“ verwendet werden. Jedes Zimmer hat eine Flagge. Jeder Raum beginnt mit der Einstellung false. Wenn Sie einen Raum besuchen, setzen Sie das Flag auf true., Schließlich haben Sie im „Basisfall“eine Zeile wie:

  function success = find_way_out( maze, room ) % exit chack if room is visited → return false % rest of code ... end  

Rekursion kann gleichermaßen gut auf Computeralgorithmen angewendet werden:

Einige computerbezogene Beispiele umfassen: Hinzufügen einer Liste von Zahlen, Berechnen der Fibonacci-Sequenz, Berechnen einer Fakultät und Sudoku.

Schleifen und Schwanzrekursion

Einige rekursive Algorithmen sind Schleifen sehr ähnlich. Diese Algorithmen werden als „tail recursive“ bezeichnet, da die letzte Anweisung im Algorithmus darin besteht, den Algorithmus neu zu starten. Tail rekursive Algorithmen können direkt in Schleifen übersetzt werden.