4 Rekursionen. 4.1 Erstes Beispiel

Ähnliche Dokumente
Datenstrukturen und Algorithmen

Beim rekursiven Aufruf einer Funktion wird jeweils ein Duplikat der gesamten Funktion im Speicher abgelegt.

Speicher und Adressraum

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

JAVA - Rekursion

Hilfsunterlagen zu Datenstrukturen und Algorithmen Stefan Klamp, WS 2010/11

Rekursive Algorithmen

Konzepte und Methoden der Programmierung Lösungen P. Fierz / FS 2012

II.3.1 Rekursive Algorithmen - 1 -

Algorithmen & Programmierung. Rekursive Funktionen (1)

12. Rekursion Grundlagen der Programmierung 1 (Java)

Komplexität von Algorithmen

Einführung in die Informatik I

Prof. Dr. Margarita Esponda

Einstieg in die Informatik mit Java

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

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

Grundlagen der Programmierung

Vorkurs Informatik WiSe 16/17

4 Effizienz und Komplexität 3.1 1

11. Rekursion, Komplexität von Algorithmen

Programmiertechnik II

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

Rekursionen (Teschl/Teschl )

Datenstrukturen & Algorithmen

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Effiziente Algorithmen und Datenstrukturen I. Kapitel 10: Lineare Algebra

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

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

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

Rekursive Funktionen

Dynamische Programmierung

Algorithmen und Datenstrukturen 1-1. Seminar -

Die Ausgangsposition. Der aus drei Scheiben bestehende Turm steht auf Platz 1.

Programmierkurs Java

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

Grundlagen der Informatik Algorithmen und Komplexität

Randomisierte Algorithmen 2. Erste Beispiele

Grundlagen der Programmierung (Vorlesung 15)

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

6.1 Natürliche Zahlen 6.2 Induktion und Rekursion 6.3 Ganze, rationale, reelle und komplexe Zahlen 6.4 Darstellung von Zahlen

Kapitel 8. Rekursionsgleichungen. Landau-Symbole. Lösen von Rekursionsgleichungen Allgemeines Iterationsmethode Spezialfälle Erzeugende Funktionen

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

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

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

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

Dynamisches Programmieren - Problemstruktur

Abschnitt: Algorithmendesign und Laufzeitanalyse

3. rekursive Definition einer Folge

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

Informatik B von Adrian Neumann

Folgen und Reihen. 1. Folgen

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

Dynamische Programmierung. Problemlösungsstrategie der Informatik

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

Achtung: Groß O definiert keine totale Ordnungsrelation auf der Menge aller Funktionen! Beweis: Es gibt positive Funktionen f und g so, dass

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

9 Türme von Hanoi Bewege Stapel von links nach rechts. In jedem Zug darf genau ein Ring bewegt werden. Es darf nie ein größerer auf einen kleine

11.1 Grundlagen - Denitionen

Numerische Verfahren und Grundlagen der Analysis

Programmierung in C++

Fachwissenschaftliche Grundlagen

5. Unterprogrammtechnik/Module

Informatik I Rekursion

16. All Pairs Shortest Path (ASPS)

WS 2009/10. Diskrete Strukturen

HOCHSCHULE KONSTANZ TECHNIK, WIRTSCHAFT UND GESTALTUNG. Das Luzifer-Rätsel. Prof. Dr. Hartmut Plesske Wintersemester 2008/09. von.

Algorithmen und Datenstrukturen

5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten. Eingabe: Gerichteter Graph G =(V, E, c)

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

4 Greedy-Algorithmen (gierige Algorithmen)

Explizite Formeln für rekursiv definierte Folgen

Grundlagen der Programmierung in C Funktionen

In der Schule lernen wir den Satz des Pythagoras: Die Flächensumme der beiden blauen Quadrate ist gleich der Fläche des schwarzen Quadrates:

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

Projekt Systementwicklung

6 Bestimmung linearer Funktionen

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

Komplexität. G. Zachmann Clausthal University, Germany Leistungsverhalten von Algorithmen

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

Differenzengleichungen. und Polynome

SOI Die Schweizer Informatikolympiade

Beispiel: Fibonacci-Zahlen

Grenzen der Berechenbarkeit

Nr. 4: Pseudo-Zufallszahlengeneratoren

Kapitel 4. Grundlagen der Analyse von Algorithmen. Xiaoyi Jiang Informatik II Datenstrukturen und Algorithmen

Vollständige Induktion

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Praktische Informatik I Der Imperative Kern Rekursive Funktionen

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

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

Großübung zu Einführung in die Programmierung

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

Oft kommt es darauf an, Potenzen a n mod m zu berechnen. Dabei kann n eine sehr groÿe Zahl sein.

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / 2015 Vorlesung 3, Donnerstag 6.

Rekursionsanfang, Rekursionsschritt oder äquivalente Antworten. (z.b.: Abbruchbedingung (= Basisfall), eigentliche Rekursion (= Selbstaufruf))

Dynamische Programmierung

Dynamische Programmierung

Einführung in die Programmierung

Klausur zur Veranstaltung Softwareentwicklung 1. Sommersemester Hessische VWA. Dr. Alexandra Roder, Bernd Ulmann 5.

Transkript:

4 Rekursionen Viele Algorithmen besitzen sowohl eine iterative als auch eine rekursive Lösung. Sie unterscheiden sich darin, dass die iterative Version meist einen etwas längeren Kode besitzt, während die rekursive Version mehr Speicher benötigt, um alle Rekursionsschritte zwischenzuspeichern. 4.1 Erstes Beispiel Der Algorithmus soll die Fakultät n! berechnen. 4.1.1 Iterative Version FAKULTAET_ITERATIV(n) 1: f 1 2: FOR i 1 to n 3: f f*i 4: RETURN f Die Laufzeit beträgt T (n) = O(n), da nur eine Schleife durchlaufen werden muss. Der Speicherbedarf ist mit O(1) unabhängig von der Inputgröÿe. 4.1.2 Rekursive Version FAKULTAET_REKURSIV(n) 1: IF n=1 THEN 2: RETURN 1 4: RETURN (n*fakultaet_rekursiv(n-1)) In Zeile 1 bendet sich die Abbruchbedingung für die Rekursion. Zur Analyse benötigt man die Laufzeit für den Fall, wenn abgebrochen wird. Hier benötigt der Algorithmus im Abbruchfall n = 1 eine Laufzeit von O(1). Im Normalfall (während der Rekursionen) kann man folgende Rekursionsgleichung aufstellen: T (n) = O(1) + T (n 1) }{{}}{{} 1 2 1. Beinhaltet die konstante Zeit, die die Zeilen 1-3 benötigen 2. Ist die Laufzeit um ein Element verringert, da FAKULTAET_REKURSIV mit (n-1) aufgerufen wird. Die Inputgröÿe ist hier die Zahl n selbst, von der die Fakultät n! berechnet werden soll. Für den Speicherverbrauch gilt ebenfalls S(n) = O(1) + S(n 1). Der Speicherverbrauch von rekursiven Algorithmen hängt im Allgemeinen von der maximalen Rekursionstiefe ab (= Anzahl der gleichzeitig oenen Funktionsaufrufe). 1

4.2 Methoden zur Lösung von Rekursionsgleichungen 4.2.1 Lösen durch Einsetzen Es wird ein Rekursionsschritt tiefer T (n 1) = O(1) + T (n 2) in die Orginalgleichung T (n) = O(1) + T (n 1) eingesetzt: T (n) = O(1) + O(1) + T (n 2) Analog erhält man durch weiteres Einsetzen eine allgemeine Formel in Abhängigkeit der Rekursionstiefe k T (n) = O(1) + O(1) + T (n 2) = O(1) + O(1) + O(1) + T (n 3) =... = k O(1) + T (n k) Die Rekursion verläuft bis zur Abbruchbedingung n = 1, dass heiÿt, bis T (1) auftritt. Man will nun eine Lösung unabhängig von k. Mit T (1) = T (n k) bekommt man n k = 1 k = n 1 und setzt in die Gleichung ein: T (n) = (n 1) O(1) + T (n n + 1) = (n 1) O(1) + T (1) = (n 1) O(1) + O(1) T (n) = O(n) Für den Speicherverbrauch S(n) = O(1) + S(n 1) folgt analog S(n) = O(n). 4.2.2 Lösen durch Induktion Zur Lösen der Rekursionsgleichung durch Induktion muss zuerst eine Lösung geschätzt und diese Annahme durch Induktion bewiesen werden. 4.3 Zweites Beispiel - Fibonacci-Zahlen Die Denition der Fibonacci-Zahlen: f n = f n 1 + f n 2 ; n 3 ; f 1 = 1, f 2 = 1 Die ersten Zahlen lauten 1, 1, 2, 3, 5, 8, 13, 21,... Die Folge ist monton wachsend und besitzt folgende Schranken: f n = f n 1 + f n 2 = f n 2 + f n 3 }{{} f n 2 +f n 2 { 2 fn 2 f n = Ω(2 n 2 ) 3 f n 2 f n = O(3 n 2 ) 2

Mit den Anfangswerten f 1 = f 2 = 1 folgt: 2 n 1 2 f n 3 n 1 2 c 1 ( 2) n f n c 2 ( 3) n f n = Θ (c n ) 4.3.1 Iterative Version Es wird die n-te Fibonacci-Zahl gesucht: FIBONACCI(n) 1: fib 1 2: fib_1 1 3: FOR i 3 to n 4: fib_2 fib_1 5: fib_1 fib 6: fib fib_1 + fib_2 7: RETURN fib 4.3.2 Rekursive Version Es wird die n-te Fibonacci-Zahl gesucht: FIBONACCI_R(n) 1: IF n 2 THEN 2: RETURN 1 4: RETURN (FIBONACCI_R(n-1)+FIBONACCI_R(n-2)) Die Rekursiongleichung lautet T (n) = O(1) + T (n 1) + T (n 2) mit T (2) = T (1) = O(1). Analog zu den Fibonacci-Zahlen kann folgende Abschätzung gemacht werden: T (n) = O(1) + T (n 1) + T (n 2) = 2O(1) + 2T (n 2) + T (n 3) }{{} T (n 2) und daher T (n) = { 2T (n 2) n T (n) = Ω(2 2 ) 3T (n 2) T (n) = O(3 n 2 ) Die Lösung ist T (n) = Θ(c n ). Der Speicheraufwand beträgt S(n) = O(1) + max{s(n 1), S(n 2)} = O(1) + S(n 1) = O(n). Die rekursive Version ist einfacher zu implementieren, besitzt jedoch exponentielle Laufzeit und linearen Speicherbedarf. 3

4.4 Die Ackermann-Funktion Es gibt zahlreiche Arten dieser rekursiven Funktion. Zum Beispiel: ACKER(n,x,y) 1: IF n=0 THEN 2: RETURN x+1 IF y=0 THEN 4: IF n=1 THEN RETURN x 5: IF n=2 THEN RETURN 0 6: IF n=3 THEN RETURN 1 7: IF n 4 THEN RETURN 2 8: RETURN ACKER(n-1, ACKER(n,x,y-1),x) 4.5 Türme von Hanoi Regeln: 3 Stäbe A, B und C Am Stab A liegen zu Beginn n unterschiedliche groÿe Scheiben Diese sollen am Ende auf Stab B liegen Es darf jeweils nur eine Scheibe bewegt werden Es darf nie eine gröÿere auf einer kleineren Scheibe liegen Zum Beispiel mit 7 Scheiben: Rekursiver Algorithmus zur Lösung: HANOI(n,x,y,z) 1: IF n=1 THEN 2: Lege Scheibe von 'x' nach 'y' 4: HANOI(n-1,x,z,y) 5: HANOI(1,x,y,z) 6: HANOI(n-1,z,y,x) 4

Der Aufruf erfolgt zum Beispiel mit HANOI (7,'A','B','C') und fordert den Algorithmus auf die 7 obersten Scheiben von A auf B unter Verwendung von C zu legen. Für die Anzahl der Züge Z(n) (n ist hier die Anzahl der Scheiben) gilt mit Z(1) = 1 Z(n) = Z(n 1) + 1 + Z(n 1) = 1 + 2 Z(n 1) = 1 + 2 [1 + 2 Z(n 2)] = 1 + 2 + 4 Z(n 2) = 1 + 2 + 4 + 8 Z(n 2) = k 1 = 2 i + 2 k Z(n k) Die Abbruchbedingung ist erreicht, wenn das Argument n k = 1 ist, also k = n 1. Damit ist n 2 n 1 Z(n) = 2 i + 2 n 1 1 = 2 i = 2 n 1 = O(2 n ). Für die Laufzeit gilt mit T (1) = O(1) analog T (n) = 1 + 2 T (n 1) =... = O(2 n ). In diesem Beispiel ist die exponentielle Laufzeit des rekursiven Algorithmus optimal. Für den Speicherverbrauch gilt mit S(1) = O(1) S(n) = O(1) + max{s(n 1), S(1), S(n 1)} = O(1) + S(n 1) = O(n). 5