Einführung in die Informatik I

Ähnliche Dokumente
Speicher und Adressraum

Projekt Systementwicklung

Algorithmen & Programmierung. Rekursive Funktionen (1)

Rekursive Funktionen

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Einstieg in die Informatik mit Java

Einführung in die Informatik I

II.3.1 Rekursive Algorithmen - 1 -

Beispiel: Fibonacci-Zahlen

3.6.4 Rekursive Funktionen

Abstrakte Algorithmen und Sprachkonzepte

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

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

Datenstrukturen und Algorithmen

Einführung in die Informatik I

Dynamische Programmierung. Problemlösungsstrategie der Informatik

Komplexität von Algorithmen

Prof. Dr. Margarita Esponda

JAVA - Rekursion

Einführung in die Programmierung

Grundlagen der Programmierung (Vorlesung 15)

Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS Prof. Dr. Margarita Esponda. Prof. Dr.

Großübung zu Einführung in die Programmierung

11. Rekursion, Komplexität von Algorithmen

Programmieren lernen mit Groovy Rekursion Rekursion und Iteration

Funktionale Programmierung. Funktionale Programmierung: Vorlesungsüberblick. Eigenschaften rein funktionaler Programmierung

Rekursion. Beispiel Fakultät (iterativ) Rekursive Java-Implementierung. Beispiel Fakultät (rekursiv) n! = n

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

12. Rekursion Grundlagen der Programmierung 1 (Java)

Einführung in die Informatik 2

Grundlagen der Programmierung

2.4 Rekursion versus Iteration

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Probabilistische Primzahltests

Programmiertechnik II

Übung 9 - Lösungsvorschlag

Algorithmen und Datenstrukturen Tafelübung 4. Jens Wetzl 15. November 2011

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

Vorkurs Informatik WiSe 16/17

Programmierkurs Java

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Rekursion

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Rekursive Algorithmen

Einstieg in die Informatik mit Java

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

Praktische Informatik I Der Imperative Kern Rekursive Funktionen

Effiziente Algorithmen und Datenstrukturen I. Kapitel 10: Lineare Algebra

4. Fortgeschrittene Algorithmen 4.1 Rekursion 4.2 Daten und Datenstrukturen 4.3 Bäume

Einführung in die Programmierung

C.3 Funktionen und Prozeduren

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Teil 14: Rekursive Programmierung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Informatik B von Adrian Neumann

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

Algorithmen und Datenstrukturen 1 Kapitel 3

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Übersicht. Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Berechnung der Cosinus-Funktion Klausuraufgabe WS 2010/2011!

Inhalt. 4.7 Funktionen

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik

Erwin Grüner

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

Baumsuche, Partielle Ordnungen und eine neue Familie uninformierter A

Einführung in die Informatik Recursion

F u n k t i o n e n Gleichungssysteme

Die Programmiersprache C Eine Einführung

Nichtlineare Optimierung ohne Nebenbedingungen

Vorlesung Datenstrukturen

Einführung in die Informatik 1

Binäre lineare Optimierung mit K*BMDs p.1/42

Mächtigkeit von WHILE-Programmen

Rekursive Funktionen sind Funktionen, die sich auf sich selbst beziehen bzw. Funktion, die sich selbst aufrufen.

2 Sortieren. Beispiel: Es seien n = 8 und a = i : a i : ϕ(i) : a ϕ(i) :

Einführung in die Programmiertechnik

Grundlagen der Informatik Algorithmen und Komplexität

JAVA - Methoden - Rekursion

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Folge 13 - Quicksort

Klausur Informatik 1 SS 08. Aufgabe Max. Punkte Punkte. Gesamtpunkte:

Informatik I Rekursion

Programmieren, Algorithmen und Datenstrukturen II 8. Allgemeine Lösungsverfahren

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Rekursive und primitiv rekursive Funktionen. Ein maschinenunabhängiges formales Berechnungsmodell auf den natürlichen Zahlen

... direkte Umsetzung in Scheme. Prozeduren und von ihnen erzeugte Prozesse Gültigkeitsbereiche und Rekursion

Prof. Dr. Heinrich Müller; Dr. Frank Weichert 7. September 2015

1 Potenzen und Polynome

In diesem Abschnitt betrachten wir nur quadratische Matrizen mit Komponenten aus einem Körper K, also A K n n für ein n N. Wenn (mit einem n > 1)

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

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

Programmierung in C++

Algorithmen und Datenstrukturen

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

4.1 Ein allgemeines Problemlösungsschema

Zweite Möglichkeit: Ausgabe direkt auf dem Bildschirm durchführen:

C- Kurs 04 Anweisungen

Advanced Programming in C

Theoretische Informatik SS 03 Übung 4

Kurs 1613 Einführung in die imperative Programmierung Musterlösung zur Klausur am

1 Fraktale Eigenschaften der Koch-Kurve

Transkript:

Einführung in die Informatik I Fortgeschrittene Rekursion Prof. Dr. Nikolaus Wulff

Problematische Rekursion Mittels Rekursion lassen sich Spezifikationen recht elegant und einfach implementieren. Leider sind jedoch die so erhaltenen Lösungen meist nicht sehr effizient, was den Speicherverbrauch und die Laufzeit betrifft. Da sich jede primitive Rekursion durch eine iterative Lösung mittels Schleifen darstellen lässt, gilt es einen strukturierten Weg zu finden, um eine rekursive Lösung in eine Iterative zu überführen. Ein erster Schritt hierzu die Endrekursion, die eine effizientere Implementierung gestattet. Prof. Dr. Nikolaus Wulff Informatik I 2

Endrekursion Eine Rekursion heißt endrekursiv, wenn der Aufruf der Rekursion die letzte Aktion zur Berechnung der rekursiven Funktion f ist. Endrekursive Funktionen zeigen ein besseres Verhalten hinsichtlich des Speicherbedarfs für lokale Variablen und den Stack, als normal rekursive Funktionen, die nach der Rekursion noch weitere Berechnungen vornehmen. Am Beispiel der rekursiven Fakultätsberechnung soll das Prinzip verdeutlicht werden. Prof. Dr. Nikolaus Wulff Informatik I 3

Rekursive Fakultät int factorial(int n) { if(n<=1) return 1; return n*factorial(n-1); Diese Implementierung der Fakultät ist nicht endrekursiv, da nach der Rekursion noch eine Multiplikation mit dem Argument n erfolgt. Sie ergibt sich z.b. für n=4 die Aufruffolge 4!: f(4) = 4 f(3) => f(4)=4 6=24 f(3)= 3 f(2) => f(3)=3 2=6 f(2) = 2 f(1) => f(2)=2 1=2 LIFO f(1)=1 Berechnung Prof. Dr. Nikolaus Wulff Informatik I 4

Endrekursion mittels Hilfsfunktion int g_factorial(int n, int fac) { if (n<=1) return fac; return g_factorial(n-1, fac*n); int factorial(int n) { return g_factorial(n, 1); Durch Einführen der Hilfsfunktion g_factorial wird die nachträgliche Multiplikation vermeiden. Die Rekursion ist nun endrekursiv. f(4) = g(4,1) = g(3,1 4) g(3,4) = g(2,4 3) g(2,12) = g(1,12 2) = 24 Prof. Dr. Nikolaus Wulff Informatik I 5

Nichtlineare Rekursion Bei der Endrekursion entfallen viele der Zwischenergebnisse, die auf dem Stack vorgehalten werden und die Funktion kann am Ende der Rekursion direkt terminieren. An dem einfachen Beispiel der Fakuktät kommt dieser Vorteil noch nicht so deutlich zum Tragen, da hier die Rekursion linear verläuft, anders wird dies bei nichtlinearen Rekursionen. Eine nichtlineare Rekursion liegt vor, wenn im Rumpf der Definition von f mehr als ein rekursiver Aufruf ist. Prof. Dr. Nikolaus Wulff Informatik I 6

Nichtlineare Rekursion Ein besonders schlechtes Lauftzeitverhalten hat die nichtlineare Rekursion, wie sie z.b. bei den Fibonacci Zahlen: 1, 1, 2, 3, 5, 8, 13, 21, 34,... vorkommt. f n := f n 1 f n 2 f 1 := f 2 :=1 Die Aufruffolge zeigt, dass viele Fibonacci Zahlen mehrfach berechnet werden und ~2 n Auswertungen notwendig sind: f n f n-1 f n-2 f n-2 f n-3 f n-3 f n-4 f n-3 f n-4... Prof. Dr. Nikolaus Wulff Informatik I 7

Auflösen der Rekursion Es ist offensichtlich, dass diese rekursive Lösung nicht effizient ist und viele der Zahlen f k unnötig oft berechnet werden. Zum Berechnen von f k werden lediglich die direkten Vorgängerzahlen f k-1 und f k-2 benötigt. Wenn der Algorithmus diese bei der Berechnung nur einmal berechnet und ab dann wiederverwendet, so wird sich die Rekursion wesentlich verkürzen. Hierzu wird eine Hilfsfunktion g eingeführt, welche die Fibonacci-Zahl f k aus den beiden vorhergehenden Funktionswerten mit linearer Endrekursion berechnet. Prof. Dr. Nikolaus Wulff Informatik I 8

Linearisierung der Rekursion int g_fibonacci(int n, int fk1, int fk2) { if (n<=1) return fk1+fk2; return g_fibonacci(n-1, fk2+fk1, fk1); int fibonacci(int n) { return g_fibonacci(n-1,1,0); Aus der nichtlinearen Rekursion ist mittels der Hilfsfunktion g eine Endrekursion geworden. Diese Lösung hat eine lineare Laufzeit ~n im Vergleich zur ursprünglichen rekursiven Lösung ~2 n Prof. Dr. Nikolaus Wulff Informatik I 9

Endrekursion > Iterative Lösung Ist erst einmal eine endrekursive Lösung gefunden worden, so ist es meistens leicht, daraus eine iterative Lösung zu entwickeln, die hinsichtlich der Laufzeit immer die bessere Variante darstellt. Die generische Struktur einer linearen Rekursion ist: g n fallst n f n ={ h n, f n 1 sonst Hierbei ist T(n) die terminierende Bedingung und im Spezialfall h(n,y)=y=f(n) ergibt sich die Endrekursion, die sich durch ein LOOP Programm, d.h eine einfache n-fache for-schleife berechnen lässt. Prof. Dr. Nikolaus Wulff Informatik I 10

Iterative Lösung unsigned fibonacci(unsigned n) { unsigned f, fk1=1, fk2=0; while (--n) { f = fk1 + fk2; fk2 = fk1, fk1 = f; return fk1; Diese iterative Lösung hat die Hilfsfunktion g durch eine Schleife ersetzt und besitzt sowohl eine optimale Laufzeit als auch den minimalen Speicherverbrauch. Prof. Dr. Nikolaus Wulff Informatik I 11

Wechselseitige Rekursion unsigned even(unsigned n) { if (n==0) return 1; return odd(n-1); unsigned odd(unsigned n) { if(n==0) return 0; return even(n-1); Indirekte Rekursion liegt vor, wenn eine Funktion f eine Funktion h aufruft, die direkt oder indirekt wiederum eine Rekursion der Funktion f aufruft, wie hier am Beispiel der Funktionen even und odd, die berechnen ob eine Zahl n gerade oder ungerade ist. Prof. Dr. Nikolaus Wulff Informatik I 12

Weitere Rekursionen Das letzte Beispiel ist ziemlich künstlich, ob eine Zahl n gerade oder ungerade ist, lässt sich mit der Modulo Operation n%2 == 1 viel einfacher und schneller herausbekommen. Das Bisektionsverfahren zur Nullstellensuche oder dem Zahlenraten lässt sich rekursiv durchführen. Rekursion wird nicht nur für rein mathematische Aufgaben verwendet, sondern auch bei Strategiespielen, die sich im weitesten Sinne auf Rekursion zurückführen lassen: Wolf, Schaf und Kohl mit Floss Das acht Damen Problem Prof. Dr. Nikolaus Wulff Informatik I 13

Graphische Rekursionen Mittels Rekursion lassen sich graphische Algorithmen entwickeln wie z.b. die fraktale Koch Kurve (1904). Eine Strecke wird in drei gleichlange Teile zerlegt. Das mittlere Teilstück wird verdoppelt und die beiden werden mit einem 60 Winkel eingefügt. Anschließend wird diese Vorschrift rekursiv auf alle Teilstücke angewandt. 1. Rekursion 0. Rekursion Prof. Dr. Nikolaus Wulff Informatik I 14

Entwicklung der Koch Kurve Rekursionstiefe: 1 2 3 4 5 Prof. Dr. Nikolaus Wulff Informatik I 15

Hilbert Kurve Die Kurve entsteht durch vier Zeichenfunktionen, die sich wechselseitig rekursiv aufrufen... Prof. Dr. Nikolaus Wulff Informatik I 16

Entwicklung der Hilbert Kurve 1 2 3 4 5 6 Mit zunehmender Rekursionstiefe wird die Kurve immer filigraner und berührt im Limes jeden Punkt der Fläche und füllt diese vollständig aus... Prof. Dr. Nikolaus Wulff Informatik I 17