Rekursion ist ein unterhaltsames Programmierkonzept, kann aber etwas schwierig zu erlernen sein. Rekursion bedeutet einfach etwas, das sich wiederholt. Wenn Sie ein freches Beispiel für Rekursion sehen möchten, suchen Sie bei Google nach Rekursion . Sie finden ein Easter Egg, bei dem die Suchergebnisvorschläge rekursiv sind. Wenn Sie andererseits lernen möchten, eine rekursive Funktion zu codieren, lesen Sie weiter!
Was ist eine rekursive Funktion?
Eine rekursive Funktion ist eine Funktion, die sich selbst aufruft. Sie erstellen im Wesentlichen eine Schleife mit einer Funktion. Wie Sie sich vorstellen können, können dies schwierig zu schreibende Funktionen sein. Sie möchten nicht, dass Ihr Code ewig läuft.
Ähnlich wie bei einer Schleife wird eine rekursive Funktion durch eine Bedingung gesteuert. Sobald die Bedingung erfüllt ist, hört die Funktion auf, sich selbst aufzurufen, wodurch die Schleife beendet wird. Auf diese Weise können Sie eine Funktion erstellen, die sich selbst aufruft, ohne dass sie für immer ausgeführt wird.
Obwohl eine rekursive Funktion wie eine Schleife wirkt, wird sie vom Computer anders ausgeführt. Daher sind einige Algorithmen in einer Schleife effizienter und andere profitieren von einer rekursiven Funktion. Aber bevor wir uns ansehen, wie man eine rekursive Funktion verwendet, müssen Sie wissen, wie man eine schreibt.
So schreiben Sie eine rekursive Funktion
Alle rekursiven Funktionen haben die gleiche Grundstruktur:
FUNCTION name IF condition THEN RETURN result ELSE CALL FUNCTION name END FUNCTION
Das obige Beispiel ist in Pseudocode geschrieben. Es skizziert die Struktur der Funktion, die auf jede Sprache angewendet werden kann. Der Einfachheit halber konzentrieren wir uns in diesem Artikel auf Python.
Das erste, was bei einer rekursiven Funktion zu beachten ist, ist, dass die Funktion die Rekursion verlässt, wenn die Bedingung erfüllt ist. Das heißt, wenn Sie eine rekursive Funktion schreiben, müssen Sie als erstes festlegen, wann die Rekursion beendet werden soll.
Wenn die Bedingung nicht erfüllt ist, ruft sich die Funktion selbst auf. Wenn Sie also Informationen an die nächste Schleife senden möchten, müssen Sie diese als Argument in Ihrer Funktion senden. Dies kann rekursiven Funktionen viel mehr Leistung verleihen.
Verwandte: Was ist eine Funktion in der Programmierung?
Beispiel einer rekursiven Funktion in Python
Es wird viel einfacher zu verstehen sein, wie Rekursion funktioniert, wenn Sie sie in Aktion sehen. Um dies zu demonstrieren, schreiben wir eine rekursive Funktion, die die Fakultät einer Zahl zurückgibt.
Fakultäten geben das Produkt einer Zahl und aller davor liegenden ganzen Zahlen zurück. Zum Beispiel ist die Fakultät von 5 5 x 4 x 3 x 2 x 1 oder 120.
def factorialFunction(numberToMultiply): if numberToMultiply == 1 : return 1 else : return numberToMultiply * factorialFunction(numberToMultiply - 1) result = factorialFunction(3) print(result) //Outputs: 6
Das obige Programm liefert Ihnen das Ergebnis 6, das ist die Fakultät der Zahl 3. Dies kann zunächst etwas verwirrend sein. Es hilft, wenn wir das Programm Schritt für Schritt durchgehen.
- Wenn die Funktion aufgerufen wird, ist numberToMultiply gleich 3.
- Die Bedingung ist nicht erfüllt, also gehen wir auf die else- Bedingung ein.
- Unsere Funktion gibt 3 * zurück, wird dann aber angehalten. Es muss sich selbst aufrufen, um den Rest des zurückgegebenen Werts zu bestimmen.
- Wenn die Funktion dieses Mal aufgerufen wird, ist der Wert von numberToMultiply gleich 2.
- Die Bedingung ist nicht erfüllt, also gehen wir auf die else-Bedingung ein.
- Unsere Funktion gibt 2 * zurück, wird dann aber angehalten. Es muss sich selbst aufrufen, um den Rest des zurückgegebenen Werts zu bestimmen.
- Die Funktion wird noch einmal aufgerufen. Diesmal ist der Wert von numberToMultiply gleich 1.
- Unsere if- Bedingung ist erfüllt. Die Funktion gibt 1 zurück.
- Die Funktion aus Schritt 6 kann nun 2 * 1 zur Funktion aus Schritt 3 zurückgeben.
- Die Funktion in Schritt drei kann jetzt 3 * 2 * 1 zurückgeben, also 6.
Rekursion ist ein kniffliges Konzept. Es kann hilfreich sein, sich das so vorzustellen, als würde man eine Funktion über eine andere stapeln. Sobald eine Funktion endgültig aufgelöst ist, kann sie die Informationen wieder den Stack hinunterschicken, bis alle Funktionen ihre Antwort haben.
Dies ist eigentlich so ziemlich das, was Ihr Computer tut. Wenn Sie die Funktion aufrufen, wird sie im Speicher gehalten, bis sie zurückgegeben wird. Das bedeutet, dass rekursive Funktionen viel mehr Speicher beanspruchen können als eine Schleife.
Daher ist es möglicherweise nicht effizient, Schleifen als rekursive Funktionen zu schreiben, aber es ist eine großartige Möglichkeit, ihre Konstruktion zu üben. Sie sollten in der Lage sein, Schleifen als rekursive Funktionen mit ähnlichen Ergebnissen zu codieren.
Ein Beispiel für die Umwandlung einer Schleife in eine rekursive Funktion
print("Enter an even number:") i = int(input()) while (i % 2) != 0 : print("That number is not even. Please enter a new number:") i = int(input())
Diese Schleife kann auch rekursiv geschrieben werden als:
def recursiveFunction(number) : if (number % 2) == 0 : return number else: print("That number is not even. Please enter a new number:") recursiveFunction(int(input())) print("Enter and even number:") i = recursiveFunction(int(input()))
Der erste Schritt besteht darin, zu bestimmen, wann Ihre Funktion beendet werden soll. In diesem Fall möchten wir, dass es stoppt, sobald eine gerade Zahl eingegeben wird. In unserem Beispiel verfolgt number die Eingabe des Benutzers. Wenn sie eine gerade Zahl eingeben, geben wir die Zahl zurück. Ansonsten werden wir weiterhin nach einer neuen Nummer fragen.
Um die Schleife einzurichten, rufen wir unsere Funktion erneut auf. Aber diesmal ist die Nummer, die wir an die nächste Funktion übergeben, die neue Nummer, die vom Benutzer eingegeben wurde. Beim nächsten Funktionsaufruf wird die Nummer überprüft.
Dies ist eine wirklich schlechte Funktion! Ja, es prüft, ob die Zahl gerade ist, wie unsere Schleife, aber es ist nicht effizient. Jedes Mal, wenn der Benutzer eine ungerade Zahl eingibt, wird die Funktion im Speicher gehalten und eine neue Funktion aufgerufen. Wenn Sie dies oft genug tun, wird Ihnen der Speicher ausgehen!
Verwandte: Grundlegende Python-Beispiele, die Ihnen helfen, schnell zu lernen
Ein reales Beispiel einer rekursiven Funktion
Die obigen Beispiele waren gute Beispiele dafür, wann Rekursion nicht verwendet werden sollte. Wo wird also Rekursion verwendet? Ein gutes Beispiel für die Verwendung von Rekursion ist die Suche in einem binären Baum.
Wenn Daten in einem binären Baum strukturiert sind, müssen Sie viele Wege gehen, um nach Daten zu suchen. An jeder Stelle im Baum müssen Sie sich entscheiden, ob Sie rechts oder links weitersuchen möchten. Sie könnten in einer Variablen speichern, welchen Teil des Baums Sie besucht haben, aber eine rekursive Funktion kann diese Informationen natürlich nachverfolgen.
Stellen Sie sich vor, wir suchen im Baum oben nach der Zahl Sechs. Wir könnten eine rekursive Funktion erstellen, die den Baum von links nach rechts durchsucht. Der Algorithmus würde ungefähr so aussehen:
FUNCTION searchTree(branchToSearch) IF find 6 OR end of tree THEN RETURN result ELSE PROCESS branch CALL FUNCTION searchTree(left) CALL FUNCTION searchTree(right) END FUNCTION
In diesem Pseudocode-Beispiel würde der Algorithmus zuerst die linke Seite des Baums durchsuchen. Jedes Mal, wenn eine neue Nummer besucht wird, wird die Funktion angehalten und im Speicher gehalten. Dadurch können wir verfolgen, wo wir waren.
Der Algorithmus wird immer die linke Seite so weit wie möglich zuerst durchsuchen. Sobald das Ende des Baums erreicht ist, wird der searchTree (links) abgeschlossen und die rechte Seite überprüft. Sobald beide Seiten überprüft sind, sichert die Suche einen Zweig und überprüft weiterhin die rechte Seite.
Wenn die Algorithmen den gesamten Baum durchsuchen würden, würden sie dies in der folgenden Reihenfolge tun:
2, 7, 2, 6, 5, 11, 5, 9 und 4
Sehen Sie, ob Sie mit dem obigen Pseudo-Code folgen können.
Rezension zu Rekursion
Rekursion ist ein fortgeschrittenes Thema. Es wird einige Zeit dauern, es zu verstehen und noch länger, um es gut zu codieren. Es hilft, wenn Sie rekursive Funktionen Schritt für Schritt durchgehen. Es kann sogar hilfreich sein, Karteikarten oder Haftnotizen zu stapeln, während Sie eine Funktion durchlaufen, wenn Sie lernen, jeden Funktionsaufruf darzustellen.
Wenn Sie eine rekursive Funktion schreiben, entscheiden Sie zunächst, wie Sie die Funktion beenden möchten. Bestimmen Sie als Nächstes, wie Sie Ihre Schleife einrichten. Identifizieren Sie, welche Informationen an den nächsten Funktionsaufruf gesendet und welche zurückgegeben werden müssen.
Der beste Weg, Rekursion zu lernen, besteht darin, sie zu üben und aus Ihren Fehlern zu lernen. Sehen Sie sich einen Teil Ihres alten Codes an und fordern Sie sich selbst heraus, Schleifen als rekursive Funktionen neu zu schreiben. Es wird Ihren Code wahrscheinlich nicht effizienter machen, aber es ist eine gute Übung.