rekursion + iteration. manchmal ist es sinnvoll auf schon erschafftes zurückzugreifen, wie z.b. auf...
TRANSCRIPT
REKURSION + ITERATION
Manchmal ist es sinnvoll auf schon Erschafftes
zurückzugreifen, wie z.B. auf das im Lauf der Zeit
durch Generationen vor uns angehäufte
Menschheitswissen
Aus dem alten Menschheitswissen einer
Generation aufbauend wird das neue
Menschheitswissen erzeugt.Das geschah immer wieder bis zur heutigen Generation.
Mathematisch könnte man dies wie folgt modellieren:
Es beginnt mit dem "Urknall" (= leere Menge).
Daraus wird dann (nach einer bestimmten Regel)
eine neue Menge konstruiert (produziert):Die Menge der Atome.
Aus dieser wird dann wieder (nach einer
bestimmten Regel) eine neue Menge konstruiert
(produziert): Die Menge der Moleküle,
usw.
Die Vereinigung all dieser Mengen ergibt dann die
Gesamtmenge. Man sagt: Diese Gesamtmenge wurde induktiv definiert (induktive
Definition)
Mit der leeren Menge beginnt alles
Aus dieser wird dann (mit Hilfe einer Regel) eine neue
gebastelt.
Aus dieser wird dann wieder (mit Hilfe einer
Regel) eine neue gebastelt, usw.
…
Die Vereinigung all dieser Mengen ist die zu konstruierende Gesamtmenge.
Dieses Verfahren nennt man Iteration (iterativ)
(lateinisch iterare = wiederholen)
Beispiel:
Definition:
n! = n * (n-1) * (n-2) * ... * 1
Zu dem Ausrufezeichen sagt man Fakultät
Was ist dann 5 Fakultät?
5! = 5 * 4 * 3 * 2 * 1=120
Die Fakultät kann man mit Hilfe von Regeln
berechnen.
---1
n ----------n*(n+1)
Regel R1: Die leere Menge produziert die Zahl 1bzw. aus der leeren Menge folgt die Zahl 1
Regel R2: Die Zahl n produziert die Zahl n*(n+1)bzw. aus der Zahl n folgt die Zahl n*(n+1)
Mit der leeren Menge beginnt alles
Aus dieser wird dann (mit Hilfe von R1) eine neue
gebastelt.
Aus dieser wird dann (mit Hilfe von R1) wieder eine
neue gebastelt.
3*2*1
Die Vereinigung all dieser Mengen ist die zu konstruierende Gesamtmenge.
1
2*1
Aus dieser wird dann (mit Hilfe von R1) wieder eine
neue gebastelt, usw.…
Aufgabe:Erstellen Sie die Funktion fak (Parameter, Rückgabe bitte selbst überlegen), die
die Fakultät einer Zahl berechnet.
int fak(int zahl){int i;int produkt=1;for(i=1;i<=zahl;i++){
produkt = produkt*i; }return produkt;
}
Aus dem alten Produkt wird das …
…neue Produkt
Weitere Lösung:
Angenommen, jemand hätte schon fak(n-1) berechnet. Wie kann man mit Hilfe
von fak(n-1) den Wert von fak(n) berechnen?
fak(n) = fak(n-1) * n
Aufgabe:Erstellen Sie die Funktion fakRek (int zahl), die die
Fakultät einer Zahl berechnet und im
Funktionskörper den in der letzten Folie erarbeiteten
Zusammenhang verwendet.
int fakRek(int zahl){ int prod; prod=fakRek(zahl-1)*zahl; return prod;}
Dieses Verfahren nennt man Rekursion (lat.
recurrere = zurücklaufen)
Konkret:Was passiert beim Aufruf
von fakRek(3)
fakRek(3)
int prod; prod=fakRek(zahl-1)*zahl; return prod;}
zahl=3(Kopie)
3 3
2
Bevor die Anweisung return prod;gemacht werden kann, muss zuerst fakRek(2) abgearbeitet werden!
Zusammengefasst:
fakRek(3)prod=fakRek(2)*3;return prod;
prod=fakRek(1)*2;return prod;
prod=fakRek(0)*1;return prod;
prod=fakRek(-1)*0;return prod;
Das Programm ist in einer
Endlosschleife!
...
Wie muss also unser Programm noch abgeändert
werden, damit es funktioniert?
int fakRek(int zahl){ int prod; if(zahl==1){ prod=1; }else{ prod=fakRek(zahl-1)*zahl;}return prod;
}
Konkret:Was passiert beim Aufruf
von fakRek(3)
fakRek(3)
prod=fakRek(2)*3;return prod;
prod=fakRek(1)*2;return prod;
prod=1;return prod; 1
2
6
6
2
1
Vorbereitung für eine Aufgabe:Ein Biologe hat die Entwicklung einer Hasenpopulation beobachtet.1. Generation: 2 Hasen.2. Generation: 4 Hasen.3. Generation: 2+4 = 6 Hasen.4. Generation: 4+6 = 10 Hasen.5. Generation: 6+10=16 Hasen....Wie geht es allgemein weiter ?Wie berechnet man die Anzahl der Hasen?
Die Anzahl der Hasen berechnet sich also (ab der 3. Generation) aus der Summe der Anzahl der Hasen der letzten 2 Generationen. Diese Folge von Zahlen nennt man die sogenannte Fibonacci-Folge .
Die Fibonacci-Folge ist eine unendliche Folge von Zahlen (den Fibonacci-Zahlen), bei der sich die jeweils folgende Zahl durch Addition ihrer beiden vorherigen Zahlen ergibt. Benannt ist sie nach Leonardo Fibonacci, der damit 1202 das Wachstum einer Kaninchenpopulation beschrieb.
Aufgabe:1) Implementieren Sie die FunktionfibIt(...) iterativ.
2) Implementieren Sie die FunktionfibRek(...) rekursiv.