REKURSION + ITERATION.

Slides:



Advertisements
Ähnliche Präsentationen
Programme in C++.
Advertisements

Algorithmentheorie 08 – Dynamische Programmierung (1)
Funktionen.
Rekursion vs. Iteration
Synonyme: Stapel, Keller, LIFO-Liste usw.
Imperative Programmierung
der Universität Oldenburg
Algorithmus. Ein Kochrezept, zum Beispiel: Kartoffelbrei.
SWITCH - Anweisung.
SWITCH - Anweisung.
Abstrakte Klassen.
REKURSION + ITERATION.
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
WHILE - Anweisung.
Der Präprozessor. Bevor der Compiler das Programm in Maschinencode übersetzt (nur dieser kann von der CPU, dem Herz des Computers, bearbeitet werden)
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
Zusammenfassung Vorwoche
Minimum Spanning Tree: MST
Thema: Fibonacci-Zahlen
Rekursive Funktionen (Fakultät)
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Effiziente Algorithmen
Polynome und schnelle Fourier-Transformation
Einführung in die Programmierung
Einführung in die Programmiersprache C 4
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
2.4 Rekursion Klassifikation und Beispiele
Algorithmen und Datenstrukturen Übungsmodul 8
ENDLICHE KÖRPER RSA – VERFAHREN.
SFZ FN Sj. 13/14 Python 3 Rekursion Inf K1/2 Sj 13/14
early binding (frühe Bindung) late binding (späte Bindung)
7. Formale Sprachen und Grammatiken
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Rekursion-
Wann ist eine Funktion (über den natürlichen Zahlen) berechenbar?
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Binärer Suchbaum I-
Unterprogramme / Methoden
Vorstellen und Herleiten der Horner Schemas
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
Verzweigung oder bedingte Anweisung. Aufgabe: Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei- stelliger Tageszähler).Wenn.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Dr. Wolfram Amme, Semantik funktionaler Programme, Informatik II, FSU Jena, SS Semantik funktionaler Programme.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Gleichung und ihre Lösung
2.4 Rekursion Klassifikation und Beispiele
Methoden - rekursiv.
Laufzeitverhalten beim Sortieren
REKURSION + ITERATION.
Dynamisches Array als "verkettete Liste"
Einführung in die Programmierung
1. Die rekursive Datenstruktur Liste 1.3 Rekursive Funktionen
2. Die rekursive Datenstruktur Baum 2.1 Von der Liste zum Baum
Informatik Kurse
Zufallszahlen in C erzeugen
Datentyp- umwandlung.
1. Die rekursive Datenstruktur Liste 1
Vorstellen und Herleiten der Horner Schemas
Rechenausdrücke (Terme) – Fachbegriffe - Rechenregeln
 Präsentation transkript:

REKURSION + ITERATION

Manchmal ist es sinnvoll auf schon Erschafftes zurückzugreifen, wie z 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) 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 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:

Zu dem Ausrufezeichen sagt man Fakultät 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.

(n,fak) ------------------- (n+1,fak*(n+1))  ----- (1,1) (n,fak) ------------------- (n+1,fak*(n+1)) Regel R1: Die leere Menge produziert die Fakultät von 1 (links die Zahl, rechts in rot die Fakultät davon) Regel R2: Aus der Fakutät von n wird die Fakultät von n+1 produziert

…  (1,1) (2,1*2) (3,2*3) Mit der leeren Menge beginnt alles Aus dieser wird dann (mit Hilfe von R1) eine neue gebastelt. (1,1) Aus dieser wird dann (mit Hilfe von R2) wieder eine neue gebastelt. (2,1*2) (3,2*3) Aus dieser wird dann (mit Hilfe von R2) wieder eine neue gebastelt, usw. … Die Vereinigung all dieser Mengen ist die zu konstruierende Gesamtmenge.

Aufgabe: Erstellen Sie die Funktion fak (Parameter, Rückgabe bitte selbst überlegen), die die Fakultät einer Zahl berechnet.

Aus dem alten Produkt wird das … 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 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 * Rekursion: fak kommt links und rechts des Gleichheitszeichens vor!

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) int fakRek(int zahl){ int prod; prod=fakRek(zahl-1)*zahl; return prod; }

Dieses Verfahren nennt man Rekursion (lat. recurrere = zurücklaufen)

Was passiert beim Aufruf von Konkret: Was passiert beim Aufruf von fakRek(3)

fakRek(3) int prod; prod=fakRek(zahl-1)*zahl; return prod; } zahl=3 (Kopie) int prod; prod=fakRek(zahl-1)*zahl; return prod; } 3 3 2 Bevor die Anweisung return prod; gemacht werden kann, muss zuerst fakRek(2) abgearbeitet werden!

Zusammengefasst:

Das Programm ist in einer Endlosschleife! fakRek(3) Das Programm ist in einer Endlosschleife! prod=fakRek(2)*3; return prod; prod=fakRek(1)*2; return prod; prod=fakRek(0)*1; return prod; prod=fakRek(-1)*0; return prod; ...

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; }

Was passiert beim Aufruf von Konkret: Was passiert beim Aufruf von fakRek(3)

prod=fakRek(2)*3; return prod; 6 fakRek(3) 2 prod=fakRek(2)*3; return prod; 6 1 prod=fakRek(1)*2; return prod; 2 prod=1; return prod; 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 Die Anzahl der Hasen berechnet sich also (ab der 3. Generation) aus der Summe der Anzahl der Hasen der letzten 2 Generationen. Die Anzahl der 1. und 2. Generation ist fest vorgeben und hat z.B. die Werte: Anzahl Hasen der 1. Generation : 2 Anzahl Hasen der 2. Generation : 4 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.

An Hand dieser Fibonacci-Folge als Beispiel kann man das allgemeine Prinzip und die Struktur einer Rekursion darstellen: den Baum. Ein Baum bildet die Struktur einer Rekursion !! Also nochmals (ganz wichtig):

Ein Baum bildet die Struktur einer Rekursion !!

Ausgangspunkt ist das folgende Zweier-Paket (Zweier-Tupel): (n,w)

(n,w) wobei n die n-te Generation und w die noch unbekannte, zu berechnende Populationsgröße bedeutet. Das 2. Element im Tupel ist der Nachbar des 1. Elements, also der Nachbar von n. Er wird hier deshalb mit N (wie Nachbar) bezeichnet. w = N(n)

die n-te Generation deren Population berechnet werden soll Dazu errechnet man die 2 vorhergehenden Generationen d.h. bildet die 2 Nachfolger im Baum ( n ,N(n) ) gilt für n ≥ 3 ( n-1 ,N(n-1) ) ( n-2 ,N(n-2) ) ... und tut dann so, als ob Populationsgrößen w1=N(n-1), und w2=N(n-2) der Nachfolger n-1 und n-2 bekannt wären. Wie kann man dann die Populationsgrößen w = N(n) durch die Populationsgrößen N(n-1) und N(n-2) berechnen? N(n) = N(n-1) + N(n-2) für n ≥ 3 Rekursion: N kommt links und rechts des Gleichheitszeichens vor!

Aufgabe: 1) Implementieren Sie die Funktion fibIt(...) iterativ. 2) Implementieren Sie die Funktion fibRek(...) rekursiv.

#include "stdafx.h" int fibIt(int n); int main(){ int erg; int n; n=5; erg = fibIt(n); printf("fibIt(%d)=%d\n", n,erg); return 0; } Fibonacci mit Iteration Anzahl Hasen der n-ten Generation

int fibIt(int n){ int i; int anzahl; int anzahl_1; int anzahl_2; if(n==1){ anzahl=2; } else if(n==2){ anzahl=4; } Anzahl der Hasen der aktuellen Generation. Anzahl der Hasen der letzten Generation. Anzahl der Hasen der vorletzten Generation.

else{ anzahl_1 = 4; anzahl_2 = 2; for(i=3;i<=n;i++){ anzahl=anzahl_1+anzahl_2; anzahl_2 = anzahl_1; anzahl_1 = anzahl; } } return anzahl; } anzahl bestimmen neue anzahl_2 bestimmen neue anzahl_1 bestimmen

#include "stdafx. h" int fibRek(int n); int main(){. int erg;. int n; #include "stdafx.h" int fibRek(int n); int main(){ int erg; int n; n=5; erg = fibRek(n); printf("fibRek(%d)=%d\n", n,erg); return 0; } Fibonacci mit Rekursion Anzahl Hasen der n-ten Generation

int fibRek(int n){ int anzahl; if(n==1) anzahl=2; else if(n==2) anzahl=4; else anzahl=fibRek(n-1)+ fibRek(n-2); return anzahl; } Um Codezeilen zu sparen, wurden überall bei if und else die Klammern { und } eingespart. Warum geht das ? Weil sich im jeweiligen if bzw. else Teil nur genau eine Anweisung befindet.