Unter Rekursion versteht man den Vorgang, dass Prozeduren oder Funktionen sich ,während ihrer Ausführung, selbst Aufrufen. Auf diese Weise, wird Programmquelltext kürzer und viele Variablenzuweisungen werden gespart. Außerdem fallen häufig Schleifen weg.
Als Beispiel für die pratktische Anwendung der Rekursion, dient der bereits bekannte Euklidische(ggt)-Algorithmus.
Die Deklaration einer rekursiven Procedur unterscheidet sich in keiner Weise von der einer normalen Procedur. Der eigentliche ggt-Algorithmus benötigt, dank der Rekursion, keine Schleife mehr. Die Abbruch Bedingung, dass der Rest = 0 sein muss, steht in der If Abfrage. Wenn das der Fall ist, wir dem Referenzparameter ggtlok das Ergebniss (blok) zugewiesen. Für den Else-Fall, tritt die Rekursion ein. Erklärung, siehe unten. |
procedure berechneggt(alok,blok :Integer; var ggtlok :Integer); var rest :Integer; begin if (alok mod blok) = 0 then ggtlok := blok else berechneggt (blok,alok mod blok,ggtlok); end; |
Der eigentliche Clou liegt in der rechts dargestellten Zeile. An dieser Stelle, setzt die Rekursion ein. Die Procedur ruft sich selbst auf. In der Speicherverwaltung wird eine reele neue Instanz der Procedur berechneggt erstellt. Das Umbennen der Variablen und die "mod" berechnung in der nicht rekursiven Procedur, wird hier dadurch ersetzt, dass die Werte an den richtigen Stellen in der aktuellen ParameterListe eingesetzt werden. Die neue "Version" der berechneggt Procedur hat die selbe Funktionsweise wie ihre erste Instanz. Erst wenn die If-Abfrage true ergibt, wird keine neue Instanz von berechneggt erstellt. Was man auch als größte Rekursionstiefe bezeichnet. |
berechneggt (blok,alok mod blok,ggtlok); |
Auch die Deklaration einer rekursiven Funktion unterscheidet sich nicht von der Normalform. Der Algorithmus selbst ist von der Logik her vollkommen gleich aufgebaut: Die If-Abfrage ist wiederum die Abbruchbedingung für die Rekursionstiefe. Wenn der Rest 0 ist, wird das Ergebniss (blok) durch den Funktionsnamen (ggt) ausgegeben. Die Rekursion funktioniert genau wie bei der Procedur. |
function ggt (alok,blok :integer) :integer; begin if (alok mod blok) = 0 then ggt := blok; else result := ggt (blok,alok mod blok); end; |
Der große Unterschied zwischen den beiden Methoden, liegt in der Art der Rückgabe des Ergebnisses. Die Proceduren (Mehrzahl, da Rekursion) geben das Ergebniss durch den Referenzparameter "ggtlok" direkt zurück. Die Funktionen hingegen, geben ihr Ergebniss ganz normal durch result an die Stelle ihres Aufrufes zurück. Dadurch, dass erst die letzte Funktion, also die bei der größten Rekursionstiefe einen reelen wert zurück gibt, wird der Wert sozusagen durchgereicht, bis er an Stelle angelangt, wo die funktion ggt zu ersten mal aufgerufen wurde. Das ändert am Ergebniss jedoch nichts. |
procedure berechneggt(alok,blok :Integer; var ggtlok :Integer); result := ggt (blok,alok mod blok); |
Abschließend ist zu sagen, dass Rekursionen zwar schwieriger zu verstehen
sind, jedoch viel zeitraubende Tipparbeit ersparen.
![]() |
|
![]() |
|
![]() |
Zur
nächsten Seite ![]() |
© 2000 LK 12 If und G. Kubitz | Hannah-Arendt-Gymnasium, Lengerich |