REKURSION + ITERATION. Manchmal ist es sinnvoll auf schon Erschafftes zurückzugreifen, wie z.B. auf...

35
REKURSION + ITERATION

Transcript of REKURSION + ITERATION. Manchmal ist es sinnvoll auf schon Erschafftes zurückzugreifen, wie z.B. auf...

Page 1: 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.

REKURSION + ITERATION

Page 2: 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.

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

Page 3: 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.

Aus dem alten Menschheitswissen einer

Generation aufbauend wird das neue

Menschheitswissen erzeugt.Das geschah immer wieder bis zur heutigen Generation.

Page 4: 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.

Mathematisch könnte man dies wie folgt modellieren:

Page 5: 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.

Es beginnt mit dem "Urknall" (= leere Menge).

Daraus wird dann (nach einer bestimmten Regel)

eine neue Menge konstruiert (produziert):Die Menge der Atome.

Page 6: 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.

Aus dieser wird dann wieder (nach einer

bestimmten Regel) eine neue Menge konstruiert

(produziert): Die Menge der Moleküle,

usw.

Page 7: 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.

Die Vereinigung all dieser Mengen ergibt dann die

Gesamtmenge. Man sagt: Diese Gesamtmenge wurde induktiv definiert (induktive

Definition)

Page 8: 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.

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.

Page 9: 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.

Dieses Verfahren nennt man Iteration (iterativ)

(lateinisch iterare = wiederholen)

Page 10: 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.

Beispiel:

Page 11: 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.

Definition:

n! = n * (n-1) * (n-2) * ... * 1

Zu dem Ausrufezeichen sagt man Fakultät

Page 12: 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.

Was ist dann 5 Fakultät?

5! = 5 * 4 * 3 * 2 * 1=120

Page 13: 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.

Die Fakultät kann man mit Hilfe von Regeln

berechnen.

Page 14: 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.

---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)

Page 15: 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.

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.…

Page 16: 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.

Aufgabe:Erstellen Sie die Funktion fak (Parameter, Rückgabe bitte selbst überlegen), die

die Fakultät einer Zahl berechnet.

Page 17: 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.

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

Page 18: 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.

Weitere Lösung:

Page 19: 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.

Angenommen, jemand hätte schon fak(n-1) berechnet. Wie kann man mit Hilfe

von fak(n-1) den Wert von fak(n) berechnen?

Page 20: 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.

fak(n) = fak(n-1) * n

Page 21: 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.

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.

Page 22: 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.

int fakRek(int zahl){ int prod; prod=fakRek(zahl-1)*zahl; return prod;}

Page 23: 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.

Dieses Verfahren nennt man Rekursion (lat.

recurrere = zurücklaufen)

Page 24: 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.

Konkret:Was passiert beim Aufruf

von fakRek(3)

Page 25: 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.

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!

Page 26: 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.

Zusammengefasst:

Page 27: 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.

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!

...

Page 28: 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.

Wie muss also unser Programm noch abgeändert

werden, damit es funktioniert?

Page 29: 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.

int fakRek(int zahl){ int prod; if(zahl==1){ prod=1; }else{ prod=fakRek(zahl-1)*zahl;}return prod;

}

Page 30: 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.

Konkret:Was passiert beim Aufruf

von fakRek(3)

Page 31: 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.

fakRek(3)

prod=fakRek(2)*3;return prod;

prod=fakRek(1)*2;return prod;

prod=1;return prod; 1

2

6

6

2

1

Page 32: 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.

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?

Page 33: 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.

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 .

Page 34: 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.

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.

Page 35: 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.

Aufgabe:1) Implementieren Sie die FunktionfibIt(...) iterativ.

2) Implementieren Sie die FunktionfibRek(...) rekursiv.