Was ist ein rekursiver Aufruf?
Beim Programmieren ist ein rekursiver Aufruf ein Befehl innerhalb einer Subroutine oder Funktion, der das Programm anweist, dieselbe Subroutine erneut auszuführen. Die Wiederholung kann das direkte Ergebnis der Funktion sein, oder es kann eine zweite Funktion ausgelöst werden, die sich wiederum auf die erste Funktion bezieht. Ein rekursiver Aufruf hat einige Ähnlichkeiten mit der gefürchteten Endlosschleife, aber die Subroutine hat immer eine bedingte Anweisung, die dem Programm mitteilt, wann die Wiederholung der Rekursion beendet werden soll.
Das Konzept der Rekursion lässt sich am besten anhand eines Beispiels veranschaulichen. Angenommen, ein Dachdecker wendet neue Schindeln auf ein Haus an. Zunächst muss er ein Bündel Schindeln auf dem Dach tragen. Nachdem er das erste Bündel festgenagelt hat, muss er die Leiter hinuntersteigen, ein weiteres Bündel entnehmen und festnageln. Der Prozess wird als eine Reihe von "go, fetch, return" fortgesetzt, bis der letzte Schindel angewendet wurde. An diesem Punkt kann der Dachdecker zum nächsten Job übergehen oder nach Hause gehen.
Das Beispiel ist zwar stark vereinfacht, enthält jedoch alle Elemente eines rekursiven Aufrufs. Es gibt einen Ausgangspunkt, der Dachdecker muss abrufen, was er benötigt, zum Anfang zurückkehren und anhalten, wenn die letzte Bedingung erfüllt ist. Dies ist im Grunde, was das Programm tut; Es startet, implementiert eine Aktion, kehrt zu sich selbst zurück und wird beendet, wenn die Endebedingung eintritt.
Die Endbedingung wird als Basisfall bezeichnet. Es ist wichtig für alle rekursiven Aufrufe; Ohne sie würde sich die Funktion weiter wiederholen. Dies führt bestenfalls dazu, dass die Speicherressourcen des Systems aufgebraucht werden. Normalerweise stürzt die Überlastung das Programm irgendwann ab, aber bis das Problem entdeckt wird, kann es zu erheblichen Schäden kommen.
Erfahrene Programmierer erkennen möglicherweise die Ähnlichkeit zwischen einem rekursiven Aufruf und einer "for" - oder "while" -Schleife. Wenn das Ziel beispielsweise darin besteht, die Gesamtbestandszahl aller Vorräte mit Teilenummern größer als 999 zu ermitteln, weist eine "for" -Schleife das Programm an, alle qualifizierenden Instanzen zu lokalisieren, und eine "while" -Schleife weist das Programm an, die Schleife auszuführen nur solange der angegebene zustand gültig ist. Man könnte sagen, dass ein rekursiver Aufruf einige der Merkmale dieser Schleifen mit einer "if-then-else" -Anweisung kombiniert. Wenn diese Bedingung erfüllt ist, tun Sie dies oder etwas anderes, wenn die Bedingung falsch ist. Rekursion ermöglicht jedoch in der Regel einen kompakteren Code und die Weitergabe des Problems an die Funktion, die näher an dem Punkt liegt, an dem es benötigt wird.