Rekursive Funktionen

Ähnliche Dokumente
Programmierung und Modellierung

Organisation. Vorlesung: Di, Do. Rechnerkennung. Übungsbetrieb: Mo, Di, Mi. Klausur

Einführung in die Funktionale Programmierung mit Haskell

Programmieren für Fortgeschrittene

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation

Programmierung 1 - Repetitorium

Logik für Informatiker. 1. Grundlegende Beweisstrategien. Viorica Sofronie-Stokkermans Universität Koblenz-Landau

Induktion und Rekursion

Strukturelle Rekursion und Induktion

Induktion und Rekursion

(1.18) Def.: Eine Abbildung f : M N heißt

Vorkurs Mathematik und Informatik Mengen, natürliche Zahlen, Induktion

Informatik I: Einführung in die Programmierung

Theoretische Informatik SS 03 Übung 3

De Morgan sche Regeln

Kapitel 3: Die Sätze von Euler, Fermat und Wilson. 8 Der Satz von Euler

Abschnitt 3: Mathematische Grundlagen

Berechnungsschemata: Funktion als Parameter abstrahiert Operation im Schema, wird bei Aufruf des Schemas konkretisiert

( )= c+t(n-1) n>1. Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3)

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

Zahlentheorie I - Tipps & Lösungen. Aktualisiert: 15. Oktober 2016 vers Teilbarkeit

II.3.1 Rekursive Algorithmen - 1 -

Induktive Beweise und rekursive Definitionen

Allgemeingültige Aussagen

Induktive Beweise und rekursive Definitionen

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation

Programmiertechnik Methoden, Teil 2

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

Elemente der Algebra und Zahlentheorie Musterlösung, Serie 3, Wintersemester vom 15. Januar 2006

Kapitel 1. Grundlegendes

Rekursive Funktionen

3. rekursive Definition einer Folge

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

Beispiel 1: Fakultät

2 Mengen und Abbildungen

3 Vom Zählen zur Induktion

Komplexität von Algorithmen

Abschnitt 3: Mathematische Grundlagen

1 Das Prinzip der vollständigen Induktion

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

Formale Methoden der Softwaretechnik 1 Vorlesung vom : Grundlage von Isabelle

Kapitel 1. Grundlagen Mengen

Kapitel 1. Grundlagen

Rekursion und Induktion

Primitiv rekursive Funktionen

Informatik I. Informatik I Iteration vs. Rekursion. Iteration vs. Rekursion Iteration vs. Rekursion. 20. Iteration vs.

Logik in der Schule. Bildungsplan 2004 (Zitat:) Begründen. Elementare Regeln und Gesetze der Logik kennen und anwenden

Lösungsvorschlag Serie 2 Rekursion

Theoretische Informatik. Alphabete, Worte, Sprachen

Grundbegriffe der Informatik

Folgen und Reihen. 1. Folgen

Algorithmen & Programmierung. Rekursive Funktionen (1)

Grundlagen der Programmierung WS 15/16 (Vorlesung von Prof. Bothe)

8 Summen von Quadraten

4. Induktives Definieren - Themenübersicht

3. Vorlesung. Arithmetische Theorien.

Syntax der Prädikatenlogik: Komplexe Formeln

17 Lineare Abbildungen

Surjektive, injektive und bijektive Funktionen.

Normalformen boolescher Funktionen

Kapitel III. Aufbau des Zahlensystems

LOOP-Programme: Syntaktische Komponenten

Mengen. Eigenschaften. Spezielle Mengen (1) Prominente Mengen. ! Mengenzugehörigkeit

Übungen zum Vorkurs Mathematik für Studienanfänger Ein leeres Produkt ist gleich 1, eine leere Summe 0. ***

In diesem Kapitel wiederholen wir Begriffe und Notationen für grundlegende mathematische

Speicher und Adressraum

Behauptung: Es gibt unendlich viele Primzahlen.

Kapitel 3. Natürliche Zahlen und vollständige Induktion

Grundlagen der Programmierung in C Funktionen

Übung zur Vorlesung Berechenbarkeit und Komplexität

Theoretische Informatik SS 03 Übung 5

Grundbegriffe der Informatik

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

Einführung in die Informatik 1

WS 2013/14. Diskrete Strukturen

1 Potenzen und Polynome

8 Der Kompaktheitssatz und der Satz von Löwenheim und Skolem

Seminarvortrag aus Reiner Mathematik Existenz von Primitivwurzeln

6. Induktives Beweisen - Themenübersicht

Seminar Kommutative Algebra und Varietäten Vortrag 1: Ideale kommutativer Ringe

Ferienkurs Analysis 1: Übungsblatt 1

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

WS 2009/10. Diskrete Strukturen

Blatt 0: Mathematik I für Ingenieure (B) Abbildungen und Kompositionen. apl. Prof. Dr. Matthias Kunik/ Dr. Uwe Risch

Seminar zur Zahlentheorie Spezialfälle des Satzes von Fermat

Rekursion. Sie wissen wie man Programme rekursiv entwickelt. Sie kennen typische Beispiele von rekursiven Algorithmen

Konvexe Mengen. Kanglin,Chen. Universität Bremen, Proseminar WS 04/05

Vorsicht bei redundanten und unvollständigen Matches!

Eigenschaften von Relationen. Relationen können rechtseindeutig linkseindeutig rechtstotal linkstotal sein.

Abbildungen. Kapitel Definition: (Abbildung) 5.2 Beispiel: 5.3 Wichtige Begriffe

Erwin Grüner

WS 2009/10. Diskrete Strukturen

Regulär variierende Funktionen

Lösung zur Übung für Analysis einer Variablen WS 2016/17

Vorkurs Mathematik. Vorlesung 8. Angeordnete Körper

Einführung in die mathematische Logik

Lösungsvorschlag zur Übungsklausur zur Analysis I

Komplexität von Algorithmen

Grundbegriffe der Informatik

Vokabelliste FB Mathematik Vokabeln 7./8. Klasse // Vokabeln 9./10. Klasse // Vokabeln Sek II. Mengenbegriffe:

Transkript:

Rekursive Funktionen Man kann eine Funktion f : A B durch einen Term definieren, der selbst Aufrufe von f enthält. Beispiel: fakultät = function(n)if n = 0 then 1 else n fakultät(n 1) Dies bezeichnet man als rekursive Definition. Wie man formell den Wert einer rekursiv definierten Funktion (kurz: rekursiven Funktion) bestimmt, sehen wir später. Jetzt rechnen wir einfach aus: fakultät(3) = 3 fakultät(2) = 3 2 fakultät(1) = 3 2 1 fakultät(0) = 3 2 1 1 = 6 Informatik I WS03/04 Martin Hofmann 53

Rödelheim Beachte: Rekursion ist eine Quelle von Undefiniertheit: Wenn f = function(n)if n = 0 then 1 else f(n + 1) dann ist f(0) = 1 und f(n) undefiniert für n > 0. Also f : N N, aber D(f) = {0}. Informatik I WS03/04 Martin Hofmann 54

Mehr Rekursion Die Fibonacci-Zahlen: fib : N N fib = function(n)if n = 0 then 1 else if n = 1 then 1 else fib(n 1) + fib(n 2) Interpretation: fib(n) = Hasenpopulation nach n Monaten unter der Annahme, dass Hasen jeden Monat einen Nachkommen haben, dies aber erst ab dem zweiten Lebensmonat. fib(n) ( 5 + 1 2 ) n Informatik I WS03/04 Martin Hofmann 55

Nochmal 3n+1 g = function(n)if n mod 2 = 0 then n/2 else 3n + 1 f = function(n)if n = 1 then 0 else 1 + f(g(n)) Informatik I WS03/04 Martin Hofmann 56

Türme von Hanoi Es gibt drei senkrechte Stäbe. Auf dem ersten liegen n gelochte Scheiben von nach oben hin abnehmender Größe. Man soll den ganzen Stapel auf den dritten Stab transferieren, darf aber immer nur jeweils eine Scheibe entweder nach ganz unten oder auf eine größere legen. Angeblich sind in Hanoi ein paar Mönche seit Urzeiten mit dem Fall n = 64 befasst. Informatik I WS03/04 Martin Hofmann 57

Lösung Für n = 1 kein Problem. Falls man schon weiß, wie es für n 1 geht, dann schafft man mit diesem Rezept die obersten n 1 Scheiben auf den zweiten Stab (die unterste Scheibe fasst man dabei als Boden auf.). Dann legt man die größte nunmehr freie Scheibe auf den dritten Stapel und verschafft unter abermaliger Verwendung der Vorschrift für n 1 die restlichen Scheiben vom mittleren auf den dritten Stapel. Informatik I WS03/04 Martin Hofmann 58

Lösung in Pseudocode Turm = {1, 2, 3} Befehle = {(i, j) i, j Turm, i j} Befehlsfolge = { b es gibt n so dass B Befehle n } Lösung : N Turm Turm Befehlsfolge Lösung = function(n, i, j) Liefert Befehlsfolge zum Transfer von n Scheiben von i nach j if i = j then leere Befehlsfolge else let k = 6 i j in Lösung(n 1, i, k) (i, j) Lösung(n 1, k, j) Informatik I WS03/04 Martin Hofmann 59

Technik der Einbettung Im Beispiel mussten wir eine allgemeinere Funktion rekursiv definieren. Versuchen wir, nur die Funktion verschiebe von 1 nach 2 zu definieren, dann ergibt sich keine rekursive Lösung. Häufig muss man vor einer rekursiven Lösung das Problem generalisieren. Diese Technik bezeichnet man als Einbettung Informatik I WS03/04 Martin Hofmann 60

Beispiele von Einbettung: Primzahlen Man soll bestimmen, ob n eine Primzahl ist. Gesucht istprim : nat bool mit istprim(n) = true gdw., n prim. istprim = function(n)if n = 0 n = 1 then false else if n = 2 then true else? Informatik I WS03/04 Martin Hofmann 61

Primzahlen keineteiler = function(n:nat, k:nat)bool result Stellt fest, ob n keine Teiler im Bereich k... n 1 hat if k n 1 then true else (k n) keineteiler(n, k + 1) istprim = function(n:nat)bool n > 1 keineteiler(n, 2) Informatik I WS03/04 Martin Hofmann 62

Beispiel: Binäre Suche Man soll ein Wort im Lexikon suchen. suche : Lexikon Wort bool suche(l, w) = w kommt in l vor Noch nicht detailliert genug. Wir nehmen an, es gibt eine Funktion nteswort : Lexikon Wort die das n-te Wort im Lexikon liefert. Informatik I WS03/04 Martin Hofmann 63

Lösung eins: alle durchprobieren suchebis = function(l, w, n:nat)bool if n = 0 then false else suchebis(l, w, n 1) w = nteswort(l, n) suche = function(l, w) suchebis(l, w, anzahlwörter(l)) Informatik I WS03/04 Martin Hofmann 64

Lösung zwei: binäre Suche suchevonbis = function(l, w, i:int, j:int)bool if i > j then false else if i = j then nteswort(l, i) = w else let m = (i + j)/2 in let w m = nteswort(l, m) in if w m = w then true else if w kommt vor nteswort(l, m) then suchevonbis(l, w, i, m 1) else suchevonbis(l, w, m + 1, j) suche = function(l, w) suchevonbis(l, w, 1, anzahlwörter(l)) Informatik I WS03/04 Martin Hofmann 65

Abstiegsfunktion Um festzustellen, ob eine rekursiv definierte Funktion für ein Argument definiert ist, kann man eine Abstiegsfunktion verwenden. Sei f : A B f = function(x)φ(f, x) eine rekursive Definition einer Funktion f : A B. Φ(f, x) bezeichnet hier den definierenden Term, der sowohl f, als auch x enthält. Sei A A eine Teilmenge von A und werde in Φ(f, x) die Funktion f nur für Argumente y A aufgerufen. Sei Φ(f, x) immer definiert, wenn x A und f(y) definiert ist für alle Aufrufe f(y) in Φ(f, x). Dann muss noch nicht unbedingt gelten A D(f). Informatik I WS03/04 Martin Hofmann 66

Abstiegsfunktion Sei nun zusätzlich m : A N eine Funktion mit A D(m) mit der folgenden Eigenschaft: Im Term Φ(h, x) wird h nur für solche y A aufgerufen, für die gilt m(y) < m(x). Dann ist A D(f). Man bezeichnet so ein m als Abstiegsfunktion. Informatik I WS03/04 Martin Hofmann 67

Beispiel Fakultät fakultät(n:nat) = if n = 0 then 1 else n fakultät(n 1) Hier nehmen wir A = nat und m(x) = x. Informatik I WS03/04 Martin Hofmann 68

Beispiel keineteiler keineteiler = function(n:nat, k:nat)bool pre Stellt fest, ob n keine Teiler im Bereich k... n 1 hat if k n 1 then true else k n keineteiler(n, k + 1) Hier setzen wir A = nat nat und m(n, k) = if k n then 0 else n k. Informatik I WS03/04 Martin Hofmann 69

Wohlfundierte Relationen Definition Sei M eine Menge. Eine Relation R M M ist wohlfundiert, wenn es keine unendliche Folge a 1, a 2, a 3,... von Elementen in M gibt sodass a i+1 Ra i für alle i 1. Ist R eine wohlfundierte Relation auf einer Menge M, so kann man anstelle einer Abstiegsfunktion m : A N auch eine Abstiegsfunktion m : A M wählen, derart dass m(y)rm(x) wenn f(y) in Φ(f, x) aufgerufen wird. Informatik I WS03/04 Martin Hofmann 70

Beispiele M = N und xry x < y. M = N und xry y = x + 1 M = N N und (x 1, x 2 )R(y 1, y 2 ) x 1 < y 1 x 1 = y 1 x 2 < y 2. Mit dieser wohlfundierten Relation kann man die Ackermannfunktion rechtfertigen: ackermann = function(x:nat, y:nat)nat if x = 0 then y + 1 else if y = 0 then ackermann(x 1, 1) else ackermann(x 1, ackermann(x, y 1)) Hier wählen wir die Abstiegsfunktion m(x, y) = (x, y). Informatik I WS03/04 Martin Hofmann 71

Verschränkte Rekursion Manchmal rufen sich zwei Funktionen gegenseitig rekursiv auf. Das ist verschränkte Rekursion. Beispiel gerade = function(x:nat)if x = 0 then true else ungerade(x 1) ungerade = function(x:nat)if x = 0 then false else gerade(x 1) Es ist gerade(x) = (x mod 2=0). Informatik I WS03/04 Martin Hofmann 72

Verschränkte Rekursion über kartesische Produkte Man kann verschränkte Rekursion durch Produkte simulieren: gerade/ungerade = function(x:nat)bool bool if x=0 then (true, false) else let (g, u) = gerade/ungerade(x 1) in (u, g) Stimmen die Quellen der beiden verschränkt rekursiven Funktionen nicht überein, dann muss man das Produkt der beiden Quellen nehmen. Diese Simulation legt auch nahe, was von einer Abstiegsfunktion für verschränkt rekursive Funktionen zu fordern ist. Informatik I WS03/04 Martin Hofmann 73

Induktionsbeweise So wie man eine Funktion rekursiv definieren kann, also durch Rückgriff auf andere (hoffentlich schon bekannte) Funktionswerte, so kann man eine Behauptung dadurch beweisen, dass man sie für andere Fälle als bereits bewiesen voraussetzt (rekursiver Beweis). Natürlich muss man dann argumentieren, dass die Kette der rekursiven Rückgriffe irgendwann abbricht, wozu sich wiederum die Abstiegsfunktion anbietet. Ein solcher rekursiver Beweis mit Abstiegsfunktion ist ein Induktionsbeweis. Informatik I WS03/04 Martin Hofmann 74

Induktionsprinzip Sei R eine wohlfundierte Relation auf einer Menge M, m : A M eine Funktion, P A eine Teilmenge von A. Falls für alle a A gilt a ist in P unter der Annahme, dass alle y A mit m(y)rm(a) in P sind dann ist P = A. Informatik I WS03/04 Martin Hofmann 75

Beweis des Induktionsprinzips Äquivalente Formulierung der Bedingung: Falls a P dann existiert y A mit m(y)rm(x) und y P. Ein einziges Gegenbeispiel a P zieht also eine unendlich lange Kette von Gegenbeispielen nach sich im Widerspruch zur Wohlfundiertheit von R. Informatik I WS03/04 Martin Hofmann 76

Induktion Oftmals ist A = N und m(n) = n und xry, falls y = x + 1. Hier muss man 0 P ohne Voraussetzungen zeigen. Bei a = y + 1 darf man aber y P schon voraussetzen. Informatik I WS03/04 Martin Hofmann 77

Beispiel Behauptung: Jedes nur denkbare Verfahren zum Transfer von n Scheiben braucht mindestens 2 n 1 Befehle. Sei P die Menge derjenigen Zahlen n für die das gilt. 0 P ist klar, da 2 0 1 = 0. Sei jetzt n > 0. Irgendwann wurde die größte Scheibe verlegt. Dazu aber müssen n 1 Scheiben weggeschafft worden sein (auf den Hilfsstapel). Nach Annahme kostet das mindestens 2 n 1 1 Befehle. Danach müssen die n 1 Scheiben auf die größte verschafft werden: wieder 2 n 1 1 Befehle. Insgesamt also 2 2 n 1 2 + 1 = 2 n 1 Befehle. Informatik I WS03/04 Martin Hofmann 78

Beispiel Sei φ = 5+1 2. Beachte: φ 2 = φ + 1. Behauptung: Es ist fib(n) = aφ n + b( φ) n wobei a + b = 1 und aφ b(1/φ) = 1. Sei P die Menge der n für die das wahr ist. Wir wählen m(x) = x und yrx y < x. Es ist 0 P und 1 P (Nach Def. von a, b; bei Zweifel nachrechnen) Wenn n 2, dann fib(n) = fib(n 1) + fib(n 2) = aφ n 1 + b( φ) n+1 + aφ n 2 + b( φ) n+2 = aφ n (φ 1 + φ 2 ) + b( φ) n ( φ + φ 2 ) = aφ n + b( φ) n. Also n P und P = N. Informatik I WS03/04 Martin Hofmann 79

Kettenbruch und Kettenwurzel Es ist φ 2 = 1 + φ, also (1/φ) = 1 1+(1/φ), also 1/φ = 1 1 + 1 1+ 1 1+ 1 1+ 1... Außerdem φ = 1 + φ, also φ = 1 + 1 + 1 + 1 +.... Die Zahl φ = 5+1 2 heißt Goldener Schnitt. Informatik I WS03/04 Martin Hofmann 80

Pflasterung Es gelte, ein 2 n Rechteck mit Dominos der Größe 2 1 zu pflastern. Behauptung: Die Anzahl der Möglichkeiten, das zu tun beträgt fib(n). Sei P die Menge der n, für die das gilt. Sei n fest aber beliebig vorgegeben. Wenn n 1, dann n P. Wenn n > 1, dann gibt es zwei Möglichkeiten, die linke obere Ecke a zu pflastern. Entweder mit einem senkrechten oder mit einem waagrechten Domino. Im ersten Fall bleibt ein Rechteck der Größe 2 (n 1) zu pflastern. Da n 1 P gibt es dafür fib(n 1) Möglichkeiten. Im anderen Fall ist man gezwungen auf die linke untere Ecke auch ein waagrechtes Domino zu legen es bleibt ein Rechteck der Größe 2 (n 2), welches man auf fib(n 2) Arten pflastern kann. Insgesamt hat man also fib(n 1) + fib(n 2) = fib(n) Möglichkeiten und es ist n P. a Höhere Mächte befahlen: Linke obere Ecke schwarz malen (SIGMAR POLKE) Informatik I WS03/04 Martin Hofmann 81

Exponentiation exp = function(x:real, n:nat)real if n=0 then 1 else n gerade then exp(x, n div 2) 2 else exp(x, n div 2) 2 x Hier ist n div 2 die ganzzahlige Division, z.b., 5 div 2 = 2. Man beweise: exp(x, n) = x n. Informatik I WS03/04 Martin Hofmann 82

Polymorphe Funktionen Manchmal gestattet ein Term mehrere Typisierungen. Man kann ihm dann einen Typ mit Typvariablen zuweisen. Typvariablen bezeichnen wir mit griechischen Buchstaben α, β, γ. Ein Typ mit Typvariablen heißt polymorpher Typ (auch Polytyp). Ein Typ ohne Typvariablen heißt auch monomorpher Typ (auch Monotyp). Beispiele: erstes : α β α erstes = function(x, y)x tausch : α β β α tausch = function(x:α, y:β)(y, x) Informatik I WS03/04 Martin Hofmann 83

Polymorphe Funktionen Man kann eine polymorphe Funktionen f : typ typ mit einem Argument x aufrufen, falls es eine Ersetzung der Typvariablen in typ gibt, sodass der Typ von x herauskommt. Das Ergebnis des Aufrufes f(x) hat den den Typ, der sich durch dieselbe Ersetzung der Typvariablen in typ ergibt. tausch(7, 13) = (13, 7) : nat nat tausch(true, 13) = ( 13, true) : int bool tausch(3.14, false) = (3.14, false) : real bool Informatik I WS03/04 Martin Hofmann 84

Funktionen höherer Ordnung Wir haben schon gesehen, dass Funktionen als Argumente anderer Funktionen auftreten können. Funktionen können auch als Wert zurückgegeben werden: plus = function(x) function(y)x + y plus(2) = function(y)y + 2, also die Funktion addiere zwei dazu. Informatik I WS03/04 Martin Hofmann 85

Funktionen höherer Ordnung Allgemein kann man zu jeder Funktion f 1 : typ 1 typ n typ eine Funktion f 2 : typ 1 typ 2 typ n typ definieren durch Es ist f 2 = function(x 1 )function(x 2 )... function(x n )f 1 (x,..., x n ) f 2 x 1 x 2... x n = f 1 (x 1,..., x n ) Wir bezeichnen f 2 als das Currying von f 1 und f 1 als das Uncurrying von f 2. (Nach dem Logiker HASKELL CURRY (1900-1982)) Informatik I WS03/04 Martin Hofmann 86

Funktionen höherer Ordnung CURRY (1900 1982) SCHÖNFINKEL Schönfinkel gilt als der eigentliche Erfinder des Currying. Informatik I WS03/04 Martin Hofmann 87

Iteration und Komposition iteriere = function(f:α α, x:α, n:nat)α if n = 0 then x else iteriere(f, f(x), n 1) Es ist iteriere(f, x, n) = f(f(f(... f(x)... ) }{{} n Mal Andere Notation: iteriere(f, x, n) = f n (x). komponiere = function(g:β γ, f:α β)α γ function(x:α)g(f(x)) Andere Notation: komponiere(g, f) = g f. Informatik I WS03/04 Martin Hofmann 88

Noch ein Beispiel zur Induktion Seien f : A B und g : B A beliebige Funktionen. Für alle n ist g(iteriere(komponiere(f, g), x, n)) = iteriere(komponiere(g, f), g(x), n) Informatik I WS03/04 Martin Hofmann 89