Algorithmen & Programmierung. Rekursive Funktionen (2)

Ähnliche Dokumente
11. Folgen und Reihen.

Eine Einführung in C-Funktionen

Fibonacci-Zahlen. Geschichte. Definition. Quotienten

Leonardo da Pisa alias Fibonacci

Vom goldenen Schnitt zum Alexanderplatz in Berlin

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

Folgen und Reihen. Das Spiel ist immer lösbar. Doch wie viele Umlegungen sind es im günstigsten Fall?

Programmierkurs Java

Die Fibonacci-Zahlen 1

Grundlagen der Programmierung in C Funktionen

Herzlich willkommen zur Demo der mathepower.de Aufgabensammlung

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Geschichte Grundlagen Fibonacci-Zahlen Geometrischer Trugschluß Anwendung Fazit und Ausblick. Der Goldene Schnitt. Dario Jotanovic

Programmierung mit C Zeiger

MATHEMATIK IN KUNST UND NATUR. Fibonacci Zahlen und der goldene Schnitt

Repetitorium Informatik (Java)

1. Erläutern Sie die Aufgaben von Datentypen in der imperativen Programmierung.

Deklarationen in C. Prof. Dr. Margarita Esponda

4.4. Rang und Inversion einer Matrix

5. Unterprogrammtechnik/Module

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

C.3 Funktionen und Prozeduren

Übungspaket 19 Programmieren eigener Funktionen

Grundlagen der Programmiersprache C++

Inhalt. 4.7 Funktionen

Algorithmen & Programmierung. Zahlensysteme Bits und Bytes

Eine Einführung zum numerischen Programmieren mit Excel

Einstieg in die Informatik mit Java

Quadratische Gleichungen

ANSI C. Grundlagen der Programmierung. Ricardo Hernández García. 3. Ausgabe, 2. Aktualisierung, Dezember 2013 CANSI2

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Tag der Mathematik 2007

Eine Einführung zum numerischen Programmieren mit Excel

1 Definition. 2 Besondere Typen. 2.1 Vektoren und transponieren A = 2.2 Quadratische Matrix. 2.3 Diagonalmatrix. 2.

Komplexität von Algorithmen

Fibonaccizahlen. Auftreten in der Biologie. Bodo Werner. Department Mathematik Universität Hamburg

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Fibonacci-Folge Mathematik»Facharbeit«

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Fibonacci-Zahlen in der Mathematik

Programmieren in C/C++ und MATLAB

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

=ZÄHLENWENN Zählt die nichtleeren Zellen eines Bereiches, deren Inhalte mit den Suchkriterien übereinstimmen

Objektorientierte Programmierung

Praktikum Ingenieurinformatik. Termin 4. Funktionen, numerische Integration

Und so weiter... Annäherung an das Unendliche Lösungshinweise

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Die Involutfunktion Inhalt

12. Rekursion Grundlagen der Programmierung 1 (Java)

5 Flächenberechnung. 5.1 Vierecke Quadrat

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Übung KogInf Problemlösen, Suche, Lisp

Übungskomplex Felder (1) Eindimensionale Felder Mehrdimensionale Felder

Brückenkurs Mathematik

Das wichtigste zu logo (ucblogo)

Prof. W. Henrich Seite 1

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Vorübung 1 Beschriften Sie die Tabelle wie in der Abbildung dargestellt.

Klausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 13. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Im Folgenden möchte ich einige einfache Algorithmen zur Berechnung dieser Zahlenfolge besprechen.

Matrizen, Determinanten, lineare Gleichungssysteme

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse Lösung 10 Punkte

Bestimmung einer ersten

Exponentielles Wachstum

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Logo-Aufgaben mit Verbindung zur Mathematik

3.6.4 Rekursive Funktionen

Fibonacci-Zahlen. Teilnehmer: Herder-Oberschule, Berlin. Käthe-Kollwitz-Oberschule, Berlin. Gruppenleiter:

Unter dem Symbol n! (gelesen n Fakultät) versteht man das Produkt der natürlichen Zahlen von 1 bis n.

Biograe Grundlagen Arten Anwendung Problem. L-Systeme. Fabian Trattnig, Georg Messner, Benedikt Huber. 25. Jänner 2008

Großübung zu Einführung in die Programmierung

Grundlagen der Informatik I (Studiengang Medieninformatik)

Programmierung 2. Dynamische Programmierung. Sebastian Hack. Klaas Boesche. Sommersemester

Fibonaccis Kaninchen. Entdeckende Mathematik mit Derive. von Gregor Noll

mentor Lernhilfe: Mathematik 10. Klasse Baumann

Die Goldene Spirale Der Goldene Schnitt Das Goldene Rechteck Gruppenarbeit... 8

2 Rationale und reelle Zahlen

Differenzengleichungen. und Polynome

Dynamische Programmierung. Problemlösungsstrategie der Informatik

Algorithmen und Datenstrukturen 1 Kapitel 3

Analysis I. Vorlesung 9. Reihen

Zeichnet man nun über die Seiten des Dreiecks die Quadrate der jeweiligen Seiten, dann ergibt sich folgendes Bild:

Die Programmiersprache C

Mit ParamArrays unter VBA kann man Prozeduren und Funktionen mit einer flexiblen Anzahl von Parametern bestücken Kontext

Eine lineare Abbildung ist bijektiv, d.h. ihre Matrix ist invertierbar, falls und nur falls

FB Informatik. Fehler. Testplan

ANSI C. Grundlagen der Programmierung. Ricardo Hernández García. 3. Ausgabe, September 2011 CANSI2

Einführung in die Java- Programmierung

9.2 Invertierbare Matrizen

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Lösung zur Klausur zu Krypographie Sommersemester 2005

2. Die Satzgruppe des Pythagoras

2 Geradengleichungen in Parameterform. Länge und Skalarprodukt

Transkript:

Algorithmen & Programmierung Rekursive Funktionen (2)

Arten von Rekursion Direkte Rekursion Den Aufruf einer Funktion direkt aus ihrem Funktionskörper heraus bezeichnet man als direkte Rekursion (so haben wir es bisher gemacht). Indirekte Rekursion Rekursion kann sich auch über mehrere Funktionen erstrecken. Problem Eine Funktion muss dem Compiler bekannt sein, bevor wir sie nutzen (aufrufen) können. Deshalb haben wir bisher genutzte Funktionen immer vor nutzenden Funktionen definiert. Bei indirekter Rekursion lassen sich nutzende und genutzte Funktionen nicht eindeutig anordnen. 477

Deklaration von Funktionen Deklaration einer Funktion Eine Deklaration einer Funktion bedeutet ihre Bekanntmachung, d.h. dass dem Compiler die Existenz einer Funktion mitgeteilt wird, ohne dabei den Funktionskörper zu definieren. Bestandteile einer Deklaration Vorteil Bei einer Deklaration wird lediglich die Schnittstelle, d.h. Name, Rückgabetyp und Parameter der Funktion definiert. Sobald eine Funktion deklariert wurde kann sie genutzt (aufgerufen) werden. Definition der Funktion Wenn eine Funktion deklariert wurde, kann die zugehörige vollständige Funktion an einer beliebigen Stelle im Quelltext definiert werden. 478

Deklaration einer Funktion Deklaration vs. Funktionskopf Die Deklaration einer Funktion entspricht prinzipiell dem Funktionskopf einer vollständigen Funktionsdefinition und wird von einem Semikolon (statt des Funktionsrumpfes) abgeschlossen. Gemeinsamkeiten von Deklaration und Definition Funktionsname, Anzahl, Typ und Anordnung der Parameter müssen übereinstimmen Mögliche Unterschiede Die Benennung der einzelnen Parameter kann sich voneinander unterscheiden. Bei der Deklaration kann die Benennung der Parameter sogar ganz entfallen, es reicht hierbei eine einfache Auflistung der Datentypen der verwendeten Argumente. Prototyp Deklarierte Funktionen werden auch als (Funktions)-Prototyp bezeichnet. 479

Fehlende Deklaration Achtung Trifft ein C-Compiler auf einen Funktionsaufruf, ohne dass die entsprechende Funktion vorher definiert oder deklariert wurde, wird die Funktion implizit deklariert. Da der Compiler zu diesem Zeitpunkt jedoch weder den Rückgabetyp noch die Typen der Parameter dieser Funktion kennt, muss er dafür Annahmen treffen: Merke Der Rückgabetyp implizit deklarierter Funktionen ist immer int Die Typen der Parameter implizit deklarierter Funktionen werden vom Compiler geraten!!! Vor der Verwendung einer Funktion sollte zumindest ein Funktionsprototyp deklariert worden sein. Dadurch werden falsche Annahmen des Compilers über die Datentypen verhindert. Anmerkung Aktuelle Compiler ( C99) erkennen und verhindern teilweise solche Situationen. 480

Indirekte Rekursion Anwendungsbeispiel Aufgabe ist die Entwicklung eines simplen Taschenrechner -Programms, das den Wert eines vollständigen dyadischen Ausdrucks berechnet. Annahmen als Zahlenwerte sind nur nichtnegative einstellige ganze Zahlen zulässig Ausdrücke können mittels Klammerung geschachtelt werden als Operationen sind nur die Grundrechenarten erlaubt das Erkennen verschiedener Fehlerzustände soll möglich sein die Zeichen des dyadischen Ausdrucks werden direkt von der Tastatur gelesen 481

Beispiel Taschenrechner Grammatik in EBNF Ausdruck = Operand Operator Operand Operand = "(" Ausdruck ")" Zahl Zahl = "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" Operator = "+" " " "*" "/" Vereinfachung Da Zahl und Operator nur aus Terminalsymbolen bestehen, können wir sie direkt in Ausdruck und Operand integrieren: Ausdruck = Operand ("+" " " "*" "/") Operand Operand = "(" Ausdruck ")" "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" 482

Beispiele rekursiver Funktionen Fibonacci-Zahlen Pascalsches Dreieck Rekursiver pythagoräischer Baum

Fibonacci Person Fibonacci war ein italienischer Mathematiker (1170-1250). Fibonaccis Hauptwerk Liber abaci führte in Europa die arabischen Ziffern und die Null ein und popularisierte das Dezimalsystem. Problem Fibonacci beschrieb in seinem Buch Liber abaci folgendes Problem: Ein Mann setzt ein Kaninchenpaar in ein Gehege. Diese Kaninchen bekommen jeden Monat ein weiteres Paar. Ein eben geborenes Paar wird nach zwei Monaten fruchtbar. Wie viele Kaninchenpaare gibt es nach einem Jahr in diesem Gehege? 484

Fibonacci-Folge Regelmäßigkeit Wir erkennen, dass sich die Anzahl der Kaninchen eines Monats aus der Summe der Anzahl der Kaninchen der beiden vorherigen Monate ergibt. Fibonacci-Folge Jede Folge deren Glieder sich aus der Summe der beiden vorhergehenden Glieder ergeben, d.h. a n+2 = a n + a n+1 wird Fibonacci-Folge genannt. Standardfolge wir legen a 0 mit 0 und a 1 mit 1 fest und erhalten dann folgende Standardfolge: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377,... 485

Aufrufgraph für fib_rek(6) 486

Eigenschaften der Fibonacci-Folge Goldener Schnitt Der Quotient zweier benachbarter Glieder strebt gegen den goldenen Schnitt: $ Φ = lim a n & % a n 1 ' ) ( Der goldene Schnitt Φ ist ein berühmtes Verhältnis von Strecken in der Architektur. Eine Strecke der Länge l ist durch einen Punkt p im goldenen Schnitt unterteilt, wenn die beiden Teilstrecken im gleichen Verhältnis stehen wie die gesamte Strecke zu der größten der beiden Teilstrecken: p l l p l p = p l p 487

Die Fibonacci-Spirale Die Glieder der Fibonacci-Folge bezeichnen die Seitenlänge von Quadraten. Dabei setzt man für 13 jedes folgende Glied das korrespondierende Quadrat in folgender Reihenfolge aneinander: links 8 2 3 1 1 5 oben rechts unten Werden die einander gegenüberliegenden Ecken 0 1 1 2 3 5 8 13... jedes Quadrats in der gleichen Reihenfolge mit einer Kurve verbunden, erhält man eine Spirale. 488

Eigenschaften der Fibonacci-Zahlen Gegeben seien vier direkt aufeinander folgende Fibonacci-Zahlen f1 bis f4, d.h. für eine beliebige ganz Zahl n 0 gilt: f1 = Fib(n) f2 = Fib(n+1) f3 = Fib(n+2) f4 = Fib(n+3) Ein rechtwinkliges Dreieck lässt sich aus f1 bis f4 wie folgt darstellen: erste Kathete: a = 2 f2 f3 zweite Kathete: b = f1 f4 Hypotenuse: c = f2 2 + f3 2 489

Explizite Berechnung Die Berechnung der Fibonacci-Zahlen ist sogar direkt möglich, d.h. ohne rekursive oder iterative Berechnung vorheriger Fibonacci-Zahlen: Formel von Binet mit Hilfe des goldenen Schnitts Φ und dessen Reziprokem ϕ=φ -1 n-te Fibonacci-Zahl Fib(n) ist dann Φ = 5 +1 2 Fib(n) = Φn ( φ) n 5 = 1 5 %% ' ' && 1+ 5 2 ( * ) n % 1 5 ( ' * & 2 ) n ( * ) Achtung: Bei Berechnungen nach dieser Methode sollte für große n (n>50) die Rechenungenauigkeit reeller Zahlen unbedingt beachtet werden! 490

Beispiele rekursiver Funktionen Fibonacci-Zahlen Pascalsches Dreieck Rekursiver pythagoräischer Baum

Pascalsches Dreieck Anwendung Bisher haben wir das Pascalsche Dreieck verwendet, um schnell beliebige Potenzen von Binomen auszumultiplizieren. 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 492

Pascalsches Dreieck Bildungsprinzip Jeder Wert ist gleich der Summe der beiden rechts und links über ihm stehenden Werte Analogie Die Bildung des Pascalschen Dreiecks basiert auf dem gleichen Prinzip wie die Fibonacci-Folge: Wenn wir das Dreieck linksbündig ausgeben, dann erhalten wir die Matrix P, deren Komponenten wie folgt berechnet werden können: P[i,j] = P[i 1, j 1] + P[i 1, j] für i>0 und j>=0 P[0,0] = 1 alle sonstigen Komponenten der Matrix sind 0 und gehören zu keinem Element des Pascalschen Dreiecks 1 0 0 0 0 1 1 0 0 0 1 2 1 0 0 1 3 3 1 0 1 4 6 4 1 493

Pascalsches Dreieck 0 1 2 3 4 5 6 j 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 2 1 2 1 0 0 0 0 0 3 1 3 3 1 0 0 0 0 4 1 4 6 4 1 0 0 0 5 1 5 10 10 5 1 0 0 6 1 6 15 20 15 6 1 0 i 1.............. Weitere Eigenschaften Die Summe der nach rechts geneigten Diagonalen ergeben die Fibonacci-Folge In der zweiten Spalte befinden sich die natürlichen Zahlen In der dritten Spalte befinden sich die Dreieckszahlen Die Summe der n-ten Zeile entspricht 2 n 494

Beispiele rekursiver Funktionen Fibonacci-Zahlen Pascalsches Dreieck Rekursiver pythagoräischer Baum

Rekursiver pythagoräischer Baum Bedeutung Ein pythagoräischer Baum ist ein rekursiver grafischer Algorithmus, der ein Gebilde erzeugt, das nach mehreren Rekursionsschritten einem Baum ähnelt. Algorithmus man errichtet über zwei gegebenen Punkten ein Quadrat die Oberseite des Quadrats bildet die Grundseite eines Dreiecks, das mit einer beliebigen Höhe gezeichnet wird. die Eckpunkte der beiden Schenkel des Dreiecks bilden die Eingabe für den erneuten Ablauf des Algorithmus Terminierung Damit der Algorithmus terminieren kann, muss eine maximale Rekursionstiefe vorgegeben werden. 496

Rekursiver pythagoräischer Baum 497

Ende der Vorlesung