Rekursion
description
Transcript of Rekursion
RekursionRekursion
Was ist Rekursion?Was ist Rekursion?
Was sind rekursive Methoden?Was sind rekursive Methoden?
Worauf muss ich bei Rekursion achten?Worauf muss ich bei Rekursion achten?
Wozu braucht man Rekursion?Wozu braucht man Rekursion?
Was ist Rekursion?Was ist Rekursion?
In der Rekursion wirdIn der Rekursion wird
ein Problem vereinfacht,ein Problem vereinfacht,
indem es solange inindem es solange in
kleinere Teilproblemekleinere Teilprobleme
zerlegt wird, bis diesezerlegt wird, bis diese
so einfach sind, das sieso einfach sind, das sie
für sich genommenfür sich genommen
gelöst werden können.gelöst werden können.
Problem
Was ist Rekursion?Was ist Rekursion?
Teilprobleme
Teillösungen
Teilprobleme
Teillösungen
Was ist Rekursion?Was ist Rekursion?
Die einzelnen LösungenDie einzelnen Lösungen
(die sich aus der Abbruch-(die sich aus der Abbruch-
bedingung ergeben)bedingung ergeben)
können dann zu einerkönnen dann zu einer
GesamtlösungGesamtlösung
kombiniert werden.kombiniert werden.Teillösung
Was ist Rekursion?Was ist Rekursion?
Gesamt-Lösung
Teillösungen
Teillösungen
Teillösungen
Teillösungen
Was sind rekursive Methoden?Was sind rekursive Methoden?
Rekursive MethodenRekursive Methoden
Methoden, die sich selbst aufrufenMethoden, die sich selbst aufrufen
direktdirekt
indirektindirekt
Was sind rekursive Methoden?Was sind rekursive Methoden?
Direkt rekursive MethodeDirekt rekursive Methode
Hat im Methodenrumpf einen Aufruf von Hat im Methodenrumpf einen Aufruf von sich selbstsich selbst
Was sind rekursive Methoden?Was sind rekursive Methoden?
Beispiel für direkt rekursive Methode:Beispiel für direkt rekursive Methode:
int methodeP(int zahl) {int methodeP(int zahl) {
if (zahl == 0) return 1;if (zahl == 0) return 1;
return methodeP(zahl - 1)+1;return methodeP(zahl - 1)+1;
}}
Was sind rekursive Methoden?Was sind rekursive Methoden?
Indirekt rekursive MethodeIndirekt rekursive Methode
Ruft sich selbst nicht direkt im eigenen Ruft sich selbst nicht direkt im eigenen Rumpf auf, sondern ruft eine andere Rumpf auf, sondern ruft eine andere Methode auf, die wiederum die Methode auf, die wiederum die ursprüngliche Methode aufruft.ursprüngliche Methode aufruft.
! Das kann beliebig komplex (und damit ! Das kann beliebig komplex (und damit unübersichtlich) geschehen.unübersichtlich) geschehen.
Was sind rekursive Methoden?Was sind rekursive Methoden?
Beispiel für indirekt rekursive Methode:Beispiel für indirekt rekursive Methode:
int methodeQ(int zahl) {int methodeQ(int zahl) {return methodeP(zahl - 2) + zahl;return methodeP(zahl - 2) + zahl;
}}
int methodeP(int zahl) {int methodeP(int zahl) {if (zahl <= 0) return 1;if (zahl <= 0) return 1;return methodeQ(zahl - 1) + 1;return methodeQ(zahl - 1) + 1;
}}
Worauf muss ich bei Rekursion Worauf muss ich bei Rekursion achten?achten?
Wie schon gesehen, ist die Wie schon gesehen, ist die Abbruchbedingung sehr wichtig. Ohne sie Abbruchbedingung sehr wichtig. Ohne sie kommt die Methode in eine kommt die Methode in eine Endlosschleife.Endlosschleife.
int methodeP(int zahl) {int methodeP(int zahl) {if (zahl == 0) return 1; //Abbruchbedingungif (zahl == 0) return 1; //Abbruchbedingungreturn methodeP(zahl - 1)+1;return methodeP(zahl - 1)+1;
}}
Worauf muss ich bei Rekursion Worauf muss ich bei Rekursion achten?achten?
Was passiert beim obigen Beispiel, wenn Was passiert beim obigen Beispiel, wenn ich methodeP mit einem negativen Wert ich methodeP mit einem negativen Wert aufrufe?aufrufe?
int methodeP(int zahl) {int methodeP(int zahl) {
if (zahl == 0) return 1; //Abbruchbedingungif (zahl == 0) return 1; //Abbruchbedingung
return methodeP(zahl - 1)+1;return methodeP(zahl - 1)+1;
}}
Worauf muss ich bei Rekursion Worauf muss ich bei Rekursion achten?achten?
Die Abbruchbedingung fängt diesen Fall Die Abbruchbedingung fängt diesen Fall nicht ab. Die Methode kommt in eine nicht ab. Die Methode kommt in eine Endlosschleife.Endlosschleife.
Lösung:Lösung:
int methodeP(int zahl) {int methodeP(int zahl) {
if (zahl <= 0) return 1; //Abbruchbedingungif (zahl <= 0) return 1; //Abbruchbedingung
return methodeP(zahl - 1)+1;return methodeP(zahl - 1)+1;
}}
Wozu braucht man Rekursion?Wozu braucht man Rekursion?
Rekursion und Iteration sind gleich Rekursion und Iteration sind gleich mächtig.mächtig.
Oft bietet sich die Aufgabenstellung direkt Oft bietet sich die Aufgabenstellung direkt für eine rekursive Lösung an.für eine rekursive Lösung an.
Beispiel: Die Fakultätsfunktion (n!)Beispiel: Die Fakultätsfunktion (n!)
Wozu braucht man Rekursion?Wozu braucht man Rekursion?
Definition n!:Definition n!:
0! = 10! = 1
1! = 11! = 1
n! = n * (n-1)!n! = n * (n-1)!
Wozu braucht man Rekursion?Wozu braucht man Rekursion?
Implementierung mittels Rekursion in Java:Implementierung mittels Rekursion in Java:
int fakN(int n) {int fakN(int n) {
if(n == 0) return 1;if(n == 0) return 1; // 0! = 1// 0! = 1
if(n == 1) return 1;if(n == 1) return 1; // 1! = 1// 1! = 1
return n * (fakN(n-1));return n * (fakN(n-1)); // n! = (n-1)!// n! = (n-1)!
}}
Wozu braucht man Rekursion?Wozu braucht man Rekursion?
Wie man sieht, lässt sich die Wie man sieht, lässt sich die mathematische Definition leicht rekursiv mathematische Definition leicht rekursiv umsetzen.umsetzen.
Eine entsprechende iterative Lösung hätte Eine entsprechende iterative Lösung hätte mehr Denkarbeit gekostet.mehr Denkarbeit gekostet.
Darum: Rekursion Darum: Rekursion