Rekursion
www.infos-aus-germanien.info
Einordnung: Theoretische Informatik | Programmierung | Dynamik
- Was heiĂt Rekursion auf:
Englisch - Französisch - Italienisch - NiederlÀndisch und Schwedisch sowie Spanisch
- Sie wissen mehr ĂŒber das Thema Rekursion und möchten uns dazu etwas mitteilen?
Benutzen Sie dazu bitte unser Forum und eröffnen Sie einen neuen Thread zum Thema Rekursion.
Rekursion, auch Rekurrenz oder RekursivitĂ€t, bedeutet SelbstbezĂŒglichkeit (von lateinisch recurrere = zurĂŒcklaufen). Sie tritt immer dann auf, wenn etwas auf sich selbst verweist. Ein rekursives Element muss nicht immer direkt auf sich selbst verweisen (direkte Rekursion), eine Rekursion kann auch ĂŒber mehrere Zwischenschritte entstehen. Rekursion kann dazu fĂŒhren, dass merkwĂŒrdige Schleifen entstehen. So ist z. B. der Satz âDieser Satz ist unwahrâ rekursiv, da er von sich selber spricht. Eine etwas subtilere Form der Rekursion (indirekte Rekursion) kann auftreten, wenn zwei Dinge gegenseitig aufeinander verweisen. Ein Beispiel sind die beiden SĂ€tze: âDer folgende Satz ist wahrâ âDer vorhergehende Satz ist nicht wahrâ. Die Probleme beim VerstĂ€ndnis von Rekursion beschreibt der Satz: âUm Rekursion zu verstehen, muss man erst einmal Rekursion verstehenâ
KĂŒrzeste Definition fĂŒr Rekursion: siehe Rekursion
Rekursion ist ein allgemeines Prinzip zur Lösung von Problemen. In vielen FĂ€llen ist die Rekursion eine von mehreren möglichen Problemlösungsstrategien, sie fĂŒhrt oft zu âelegantenâ mathematischen Lösungen. Als Rekursion bezeichnet man den Aufruf oder die Definition einer Funktion durch sich selbst. Ohne geeignete Abbruchbedingung geraten solche rĂŒckbezĂŒglichen Aufrufe in einen so genannten infiniten Regress (umgangssprachlich Endlosschleife).
Zur Vermeidung von infinitem Regress insbesondere in Computerprogrammen bedient man sich der semantischen Verifikation von rekursiven Funktionen. Der Beweis, dass kein infiniter Regress vorliegt, wird dann zumeist mittels einer Schleifeninvariante gefĂŒhrt (siehe auch Invariante). Dieser Beweis ist allerdings nicht immer möglich (siehe Halteproblem).
| Inhaltsverzeichnis |
Definition
(Hinweis vorab: Rekursion oder rekursive Definitionen sind nicht auf natĂŒrliche Zahlen-definierte Funktionen beschrĂ€nkt. Hier sei auf das verallgemeinerte Rekursionsschema verwiesen.)
Die Grundidee der rekursiven Definition einer Funktion f ist: Der Funktionswert f(n+1) einer Funktion f: N0 â N0 ergibt sich durch VerknĂŒpfung bereits vorher berechneter Werte f(n), f(n-1), ... Falls auĂerdem die Funktionswerte von f fĂŒr hinreichend viele Startargumente bekannt sind, kann jeder Funktionswert von f berechnet werden. Das heiĂt im Klartext: Bei einer rekursiven Definition einer Funktion f ruft sich die Funktion so oft selber auf, bis ein vorgegebenes Argument (meistens 0) erreicht ist, so dass die Funktion terminiert (sich unterbricht).
Die Definition von rekursiv festgelegten Funktionen ist eine grundsÀtzliche Vorgehensweise in der funktionalen Programmierung. Ausgehend von einigen gegebenen Funktionen (wie z. B. die Summen-Funktion) werden neue Funktionen definiert, mit Hilfe derer weitere Funktionen definiert werden können.
Ein Spezialfall der Rekursion ist die primitive Rekursion, die stets durch eine Iteration ersetzt werden kann. Bei einer solchen Rekursion enthĂ€lt der Aufruf-Baum keine Verzweigungen, das heiĂt er ist eigentlich eine Aufruf-Kette: das ist immer dann der Fall, wenn eine rekursive Funktion sich selbst jeweils nur einmal aufruft, insbesondere am Anfang (Head Recursion, siehe Infiniter Regress) oder nur am Ende (Tail Recursion oder Endrekursion) der Funktion. Umgekehrt kann jede Iteration durch eine primitive Rekursion ersetzt werden, ohne dass sich dabei die KomplexitĂ€t des Algorithmus Ă€ndert.
Anwendung
Im Fall von primitiv-rekursiven Funktionen steht es dem Programmierer frei, eine iterative oder eine rekursive Implementation zu wĂ€hlen. Dabei ist die rekursive Umsetzung meist "eleganter", wĂ€hrend die iterative Umsetzung eine bessere Performanz zeigt (insbesondere weil der Stack weniger beansprucht wird und der Overhead fĂŒr den wiederholten Funktionsaufruf fehlt); siehe auch das Programmierbeispiel unten. Manche Programmiersprachen (insbesondere in der Funktionalen Programmierung) erlauben keine Iteration, so dass immer die rekursive Umsetzung gewĂ€hlt werden muss. Solche Sprachen setzen hĂ€ufig zur Optimierung primitive Rekursionen intern als Iterationen um (insbesondere einige Interpreter fĂŒr Lisp und Scheme tun das).
Es ist zu beachten, dass die rekursive Implementation bei manchen Funktionen (z. B. den Fibonacci-Zahlen) bedingt, dass Teillösungen mehrfach berechnet werden, was eine VerlÀngerung der Laufzeit bedeutet.
Die Rekursion ist ein wesentlicher Bestandteil einiger Entwurfsstrategien fĂŒr effiziente Algorithmen, insbesondere der Teile und Herrsche (Divide and Conquer) Strategie. Andere AnsĂ€tze (zum Beispiel so genannte Greedy Algorithmen) verlangen ein iteratives vorgehen.
Rekursion und primitiv-rekursive Funktionen spielt eine groĂe Rolle in der theoretischen Informatik, insbesondere in der KomplexitĂ€tstheorie und Berechenbarkeitstheorie. Siehe dazu auch Lambda-KalkĂŒl und Ackermann-Funktion. Im Compilerbau ist der rekursive Abstieg (Recursive Descent) eine Technik, bei der eine Sprache rekursiv geparst wird.
Beispiel
Hier ein Beispiel fĂŒr eine Funktion sum: N0 â N0, die die Summe der ersten n Zahlen berechnet:
Die Funktion sum sei definiert durch: sum(n) = 0 + 1 + 2 +...+ n
oder besser: sum(n) = sum(n-1) + n (Rekursionsschritt)
Das heiĂt also, die Summe der ersten n Zahlen lĂ€sst sich berechnen, indem man die Summe der ersten n - 1 Zahlen berechnet und dazu die Zahl n addiert. Damit die Funktion terminiert, legt man hier fĂŒr sum(0) = 0 (Rekursionsanfang) fest. Mit diesen Angaben lĂ€sst sich eine rekursive Definition angeben, die eine beliebige (hier: natĂŒrliche) Zahl x berechnet. Die Definition lautet also:
<math>\mathrm{sum}(n) = \left\{\begin{matrix} 0 && \mbox{falls }n=0 && \mbox{(Rekursionsanfang)} \\ \mathrm{sum}(n-1)+n && \mbox{falls } n \ge 1 && \mbox{(Rekursionsschritt)} \end{matrix}\right.<math>
Es gilt nun zum Beispiel:
- <math>\begin{matrix}
\mathrm{sum}(3) & = & \mathrm{sum}(2)+3 & \mbox{(Rekursionsschritt)} \\
& = & \mathrm{sum}(1)+2+3 & \mbox{(Rekursionsschritt)} \\
& = & \mathrm{sum}(0)+1+2+3 & \mbox{(Rekursionsschritt)} \\
& = & 0+1+2+3 & \mbox{(Rekursionsanfang)} \\
& = & 6
\end{matrix}<math>
Programmierbeispiel
Die beliebte und einfache Implementierung der FakultÀtsberechnung. Hier als rekursive und iterative Variante, in der Programmiersprache Java.
public class Faculty {
public static void main(String[] args) {
try { System.out.println(args[0]+"! = " + facultyRec(Integer.parseInt(args[0])));}
catch (RuntimeException t) { System.err.println("UngĂŒltiger Parameter !"); }
}
/** Rekursive Methode zur FakultÀtsberechnung */
public static long facultyRec(int n) {
if (n==0) {
return 1;
} else {
return n * facultyRec(Math.abs(n) - 1);
}
}
/** Nicht-rekursive (iterative) Methode zur FakultÀtsberechnung */
public static long facultyNonRec(int n) {
int i = 1;
while (Math.abs(n) > 0) {
i *= n;
n = Math.abs(n) - 1;
}
return i;
}
}
Ein Beispiel fĂŒr eine primitv rekursive Funktion in Delphi
function Fakultaet(n:integer):integer; begin if n <= 1 then result:=1 else result:= Fakultaet(n-1)*n; end;
Ein Beispiel fĂŒr eine indirekte Rekursion in Delphi. Es soll folgende Folge gelöst werden: -1+2-1+2-1+2-...
function TForm1.MinusEins(n:integer):integer; begin if n <= 0 then result:=0 else result:= PlusZwei(n-1)-1; end; function TForm1.PlusZwei(n:integer):integer; begin if n <= 0 then result:=0 else result:= MinusEins(n-1)+2; end;
Ein anderes Beispiel
Ein anderes, recht schön anzusehendes Beispiel ist der rekursive pythagorÀische Baum.
Der rekursive Algorithmus sieht hier wie folgt aus:
- Errichte ĂŒber zwei gegebenen Punkten ein Quadrat
- Auf der Oberseite zeichne ein Dreieck mit definierten Winkeln bzw. Höhe
- Rufe diese Funktion fĂŒr die beiden Schenkel dieses Dreieckes auf
Dies wird dann bis zu einer vorgegebenen Rekursions-Tiefe wiederholt. Bei der einfachen Rekursion entsteht ein Dreieck mit je einem Quadrat ĂŒber den drei Seiten. Davon kommt auch der Name âpythagorĂ€ische-Baumâ.
Nach mehreren Rekursions-Schritten Àhnelt das Gebilde dann immer mehr einen Baum.
Siehe auch
- Rekursion
- ”-Rekursion
- Rekursionsgleichung
- Stack
- Kellerautomat
- Continuation
- Funktion (Programmierung)
- Exception
- Suche nach Rekursion Infos mit: Yahoo
