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

Ähnliche Dokumente
Algorithmen und Datenstrukturen 04

Algorithmen und Datenstrukturen 04

II.3.1 Rekursive Algorithmen - 1 -

Algorithmen und Datenstrukturen Tafelübung 14. Jens Wetzl 8. Februar 2012

Rekursive Funktionen

Objektorientierte Programmierung (ZQ1u2B)

FHZ. K13 Rekursion. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

Vorkurs Informatik WiSe 17/18

Speicher und Adressraum

Vorkurs Informatik WiSe 16/17

Rekursive Funktionen

12. Rekursion Grundlagen der Programmierung 1 (Java)

Software Entwicklung 1

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Algorithmik 1. Kapitel 8 - Rekursion. Friedrich-Alexander-Universität Erlangen-Nürnberg. Informatik 2/8 Programmiersysteme / Künstliche Intelligenz

Klassenvariablen, Klassenmethoden

2. Algorithmische Methoden 2.1 Rekursion. 18. April 2017

11. Rekursion, Komplexität von Algorithmen

Programmieren 1 C Überblick

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

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

Programmieren I. Methoden-Special Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Datenstrukturen und Algorithmen

11. Rekursion. - Wiederholung von Anweisungen: durch Iteration und Rekursion - Anwendungsfälle der Rekursion

2. Algorithmenbegriff

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

11. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Mathematische Rekursion. Rekursion in Java: Genauso! Unendliche Rekursion. n!

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / Vorlesung 9, Donnerstag 18.

Stack. Seniorenseminar Michael Pohlig

12. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Lernziele. Mathematische Rekursion. Rekursion in Java: Genauso! n! =

Lösungsvorschlag Serie 2 Rekursion

Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen Tafelübung 1. Jens Wetzl 26. Oktober 2011

Software Entwicklung 1. Rekursion. Beispiel: Fibonacci-Folge I. Motivation. Annette Bieniusa / Arnd Poetzsch-Heffter

Algorithmen und Datenstrukturen (für ET/IT)

1. Die rekursive Datenstruktur Liste

Inhalt Kapitel 2: Rekursion

Einstieg in die Informatik mit Java

Informatik II Übung 02. Benjamin Hepp 8 March 2017

Komplexität von Algorithmen

Einführung in die Objektorientierte Programmierung Vorlesung 17: Dynamische Programmierung. Sebastian Küpper

Programmieren I. Methoden-Spezial Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Institut fu r Informatik

Datenstrukturen und Algorithmen

Übung Algorithmen und Datenstrukturen

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Informatik II - Übung 02

Algorithmen & Programmierung. Rekursive Funktionen (1)

Algorithmen und Datenstrukturen (für ET/IT)

1 Einführung. 2 Grundlagen von Algorithmen. 3 Grundlagen von Datenstrukturen. 4 Grundlagen der Korrektheit von Algorithmen

Intensivübung zu Algorithmen und Datenstrukturen

public class Test extends MiniJava { public static void main (String [] args) { write(args[0]+args[1]); } } // end of class Test

6. Algorithmen auf Zeichenketten

Algorithmenbegriff: Berechenbarkeit. Algorithmenanalyse. (Berechnung der Komplexität)

1. Rekursive Algorithmen 2. Rekursive (dynamische) Datenstrukturen

Datenstruktur Baum und Rekursion Software Entwicklung 1

Listen. M. Jakob. 20. September Gymnasium Pegnitz

Algorithmik 1. Kapitel 8 - Rekursion. Friedrich-Alexander-Universität Erlangen-Nürnberg. Informatik 2/8 Programmiersysteme / Künstliche Intelligenz

Kapitel 08: Rekursion und Terminierung Software Entwicklung 1

Übungsblatt 4. Thema: Imperative Konstrukte und Speicherorganisation in Java, Algorithmen und Rekursion

Übungspaket 22 Rekursive Funktionsaufrufe

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2013 / Vorlesung 9, Donnerstag 19.

Algorithmen und Datenstrukturen"

OOP Aufgabenblatt 7 6. Dezember 2013

Algorithmen und Datenstrukturen"

Beispiel 1: Fakultät

Friedrich-Alexander-Universität Erlangen-Nürnberg

Grundlagen der Programmierung

Informatik II - Tutorium 2

Mathematische Rekursion

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

Vorlesung Programmieren

Informatik I Tutorium WS 07/08

11. Rekursion, Komplexität von Algorithmen

Erste Java-Programme (Scopes und Rekursion)

Aufgabe 1 (12 Punkte)

JAVA - Rekursion

Dynamische Programmierung

Klausur zur Lehrveranstaltung. Technische Informatik für Ingenieure WS 2009/10

Algorithmen und Datenstrukturen SoSe 2008 in Trier. Henning Fernau Universität Trier

Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren

Informatik II Übung 5

Algorithmen und Datenstrukturen

1 Programmierfehler und ihre Behebung

Test-Driven Design: Ein einfaches Beispiel

1. Die rekursive Datenstruktur Liste

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

VL-04: Rekursionsgleichungen. (Datenstrukturen und Algorithmen, SS 2017) Gerhard Woeginger

Hallo Welt für Fortgeschrittene

Kapitel 12: Induktive

Informatik II Übung 2. Pascal Schärli

Informatik II (D-ITET) Informatik II (D-ITET) Übungsstunde 1. Distributed Systems Group, ETH Zürich

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Klassenmethoden Teil 2

Programmierung mit C Algorithmen

Transkript:

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

Folien Keine Garantie für Vollständigkeit und/oder Richtigkeit Keine offizielle Informationsquelle LS2-Webseite Abrufbar unter: http://wwwcip.cs.fau.de/~sijewetz/aud_ws11 Hinweis zu Aufgabe 4.4: Rekursive Kunst Im CIP-Pool läuft der process checker, der Programme abschießt, die lange mit hoher CPU-Auslastung laufen Große rekursive Kunstwerke auf dem eigenen Rechner! 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 2 / 19

Was machen wir heute? Rekursion Theorie Beispiele Rekursionsarten Live-Programmierung: Türme von Hanoi Induktionsbeweise Backtracking Vorgehensweise Live-Programmierung: Monopoly Klausuraufgabe zu Rekursion 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 3 / 19

Rekursion Theorie Beispiele Rekursionsarten

Theorie Rekursiver Gedanke: Wir wollen ein Problem so in ein oder mehrere (kleinere) Teilprobleme zerlegen, dass 1. bei fortgesetzter Zerlegung die Teilprobleme irgendwann so klein sind, dass sie trivial gelöst werden können 2. aus den Lösungen der kleineren Teilprobleme leicht die Lösung des größeren Problems zusammengestellt werden kann Eine rekursive Methode sieht häufig so aus: static int recursive(int arg1, int arg2,...) { // Basisfall / Basisfaelle: if (arg1 == 0 arg2 == 0) return 1; // Teilprobleme durch Rekursion loesen: int a = recursive(arg1-1, arg2); int b = recursive(arg1, arg2-1); // Zusammensetzen der Loesung aus den Teilloesungen: return a * b; 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 5 / 19

Theorie Rekursiver Gedanke: Wir wollen ein Problem so in ein oder mehrere (kleinere) Teilprobleme zerlegen, dass 1. bei fortgesetzter Zerlegung die Teilprobleme irgendwann so klein sind, dass sie trivial gelöst werden können 2. aus den Lösungen der kleineren Teilprobleme leicht die Lösung des größeren Problems zusammengestellt werden kann Eine rekursive Methode sieht häufig so aus: static int recursive(int arg1, int arg2,...) { // Basisfall / Basisfaelle: if (arg1 == 0 arg2 == 0) return 1; // Teilprobleme durch Rekursion loesen: int a = recursive(arg1-1, arg2); int b = recursive(arg1, arg2-1); // Zusammensetzen der Loesung aus den Teilloesungen: return a * b; 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 5 / 19

Theorie Rekursiver Gedanke: Wir wollen ein Problem so in ein oder mehrere (kleinere) Teilprobleme zerlegen, dass 1. bei fortgesetzter Zerlegung die Teilprobleme irgendwann so klein sind, dass sie trivial gelöst werden können 2. aus den Lösungen der kleineren Teilprobleme leicht die Lösung des größeren Problems zusammengestellt werden kann Eine rekursive Methode sieht häufig so aus: static int recursive(int arg1, int arg2,...) { // Basisfall / Basisfaelle: if (arg1 == 0 arg2 == 0) return 1; // Teilprobleme durch Rekursion loesen: int a = recursive(arg1-1, arg2); int b = recursive(arg1, arg2-1); // Zusammensetzen der Loesung aus den Teilloesungen: return a * b; 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 5 / 19

Theorie Rekursiver Gedanke: Wir wollen ein Problem so in ein oder mehrere (kleinere) Teilprobleme zerlegen, dass 1. bei fortgesetzter Zerlegung die Teilprobleme irgendwann so klein sind, dass sie trivial gelöst werden können 2. aus den Lösungen der kleineren Teilprobleme leicht die Lösung des größeren Problems zusammengestellt werden kann Eine rekursive Methode sieht häufig so aus: static int recursive(int arg1, int arg2,...) { // Basisfall / Basisfaelle: if (arg1 == 0 arg2 == 0) return 1; // Teilprobleme durch Rekursion loesen: int a = recursive(arg1-1, arg2); int b = recursive(arg1, arg2-1); // Zusammensetzen der Loesung aus den Teilloesungen: return a * b; 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 5 / 19

Beispiele f (n) = n i=1 i, n > 0 g(n): Abstand der Zahl n von 5 fib(n) = fib(n 1) + fib(n 2): Was muss man hier im Gegensatz zu den Funktionen oben beachten? Pseudocode für Listenlänge: x0, xrest = split(x) spaltet x in 1. Element und Restliste auf, empty(x) prüft, ob Liste x leer ist Stammbaum: void drawfamilytree(person p) { write(p.getname()); if (p.haschildren()) { for (Person child: p.getchildren()) { drawfamilytree(child); drawlink(person, child); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 6 / 19

Beispiele f (n) = n i=1 i, n > 0 g(n): Abstand der Zahl n von 5 fib(n) = fib(n 1) + fib(n 2): Was muss man hier im Gegensatz zu den Funktionen oben beachten? Pseudocode für Listenlänge: x0, xrest = split(x) spaltet x in 1. Element und Restliste auf, empty(x) prüft, ob Liste x leer ist Stammbaum: void drawfamilytree(person p) { write(p.getname()); if (p.haschildren()) { for (Person child: p.getchildren()) { drawfamilytree(child); drawlink(person, child); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 6 / 19

Beispiele f (n) = n i=1 i, n > 0 g(n): Abstand der Zahl n von 5 fib(n) = fib(n 1) + fib(n 2): Was muss man hier im Gegensatz zu den Funktionen oben beachten? Pseudocode für Listenlänge: x0, xrest = split(x) spaltet x in 1. Element und Restliste auf, empty(x) prüft, ob Liste x leer ist Stammbaum: void drawfamilytree(person p) { write(p.getname()); if (p.haschildren()) { for (Person child: p.getchildren()) { drawfamilytree(child); drawlink(person, child); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 6 / 19

Beispiele f (n) = n i=1 i, n > 0 g(n): Abstand der Zahl n von 5 fib(n) = fib(n 1) + fib(n 2): Was muss man hier im Gegensatz zu den Funktionen oben beachten? Pseudocode für Listenlänge: x0, xrest = split(x) spaltet x in 1. Element und Restliste auf, empty(x) prüft, ob Liste x leer ist Stammbaum: void drawfamilytree(person p) { write(p.getname()); if (p.haschildren()) { for (Person child: p.getchildren()) { drawfamilytree(child); drawlink(person, child); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 6 / 19

Beispiele f (n) = n i=1 i, n > 0 g(n): Abstand der Zahl n von 5 fib(n) = fib(n 1) + fib(n 2): Was muss man hier im Gegensatz zu den Funktionen oben beachten? Pseudocode für Listenlänge: x0, xrest = split(x) spaltet x in 1. Element und Restliste auf, empty(x) prüft, ob Liste x leer ist Stammbaum: void drawfamilytree(person p) { write(p.getname()); if (p.haschildren()) { for (Person child: p.getchildren()) { drawfamilytree(child); drawlink(person, child); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 6 / 19

Rekursionsarten Lineare Rekursion Maximal ein rekursiver Aufruf pro Methodenaufruf (verschieden Aufrufe in verschiedenen Zweigen möglich) Endrekursion Rekursiver Funktionsaufruf ist letzte Aktion zur Berechnung der Methode (was ist der Vorteil? Beispiel?) Kaskadenartige Rekursion Zwei oder mehr rekursive Aufrufe pro Methodenaufruf (was heißt das für die Laufzeit? Beispiel?) Verschränkte Rekursion Zwei Funktionen f und g heißen verschränkt rekursiv, wenn f einen Aufruf von g und g einen von f enthält Verschachtelte Rekursion Z.B. Ackermann-Funktion: static int ackermann(int m, int n) { if (m == 0) return n + 1; if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 7 / 19

Rekursionsarten Lineare Rekursion Maximal ein rekursiver Aufruf pro Methodenaufruf (verschieden Aufrufe in verschiedenen Zweigen möglich) Endrekursion Rekursiver Funktionsaufruf ist letzte Aktion zur Berechnung der Methode (was ist der Vorteil? Beispiel?) Kaskadenartige Rekursion Zwei oder mehr rekursive Aufrufe pro Methodenaufruf (was heißt das für die Laufzeit? Beispiel?) Verschränkte Rekursion Zwei Funktionen f und g heißen verschränkt rekursiv, wenn f einen Aufruf von g und g einen von f enthält Verschachtelte Rekursion Z.B. Ackermann-Funktion: static int ackermann(int m, int n) { if (m == 0) return n + 1; if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 7 / 19

Rekursionsarten Lineare Rekursion Maximal ein rekursiver Aufruf pro Methodenaufruf (verschieden Aufrufe in verschiedenen Zweigen möglich) Endrekursion Rekursiver Funktionsaufruf ist letzte Aktion zur Berechnung der Methode (was ist der Vorteil? Beispiel?) Kaskadenartige Rekursion Zwei oder mehr rekursive Aufrufe pro Methodenaufruf (was heißt das für die Laufzeit? Beispiel?) Verschränkte Rekursion Zwei Funktionen f und g heißen verschränkt rekursiv, wenn f einen Aufruf von g und g einen von f enthält Verschachtelte Rekursion Z.B. Ackermann-Funktion: static int ackermann(int m, int n) { if (m == 0) return n + 1; if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 7 / 19

Rekursionsarten Lineare Rekursion Maximal ein rekursiver Aufruf pro Methodenaufruf (verschieden Aufrufe in verschiedenen Zweigen möglich) Endrekursion Rekursiver Funktionsaufruf ist letzte Aktion zur Berechnung der Methode (was ist der Vorteil? Beispiel?) Kaskadenartige Rekursion Zwei oder mehr rekursive Aufrufe pro Methodenaufruf (was heißt das für die Laufzeit? Beispiel?) Verschränkte Rekursion Zwei Funktionen f und g heißen verschränkt rekursiv, wenn f einen Aufruf von g und g einen von f enthält Verschachtelte Rekursion Z.B. Ackermann-Funktion: static int ackermann(int m, int n) { if (m == 0) return n + 1; if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 7 / 19

Rekursionsarten Lineare Rekursion Maximal ein rekursiver Aufruf pro Methodenaufruf (verschieden Aufrufe in verschiedenen Zweigen möglich) Endrekursion Rekursiver Funktionsaufruf ist letzte Aktion zur Berechnung der Methode (was ist der Vorteil? Beispiel?) Kaskadenartige Rekursion Zwei oder mehr rekursive Aufrufe pro Methodenaufruf (was heißt das für die Laufzeit? Beispiel?) Verschränkte Rekursion Zwei Funktionen f und g heißen verschränkt rekursiv, wenn f einen Aufruf von g und g einen von f enthält Verschachtelte Rekursion Z.B. Ackermann-Funktion: static int ackermann(int m, int n) { if (m == 0) return n + 1; if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 7 / 19

Live-Programmierung: Türme von Hanoi

Türme von Hanoi Quelle: http://goo.gl/h7kos 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 9 / 19

Induktionsbeweise

Induktionsbeweise Beweismethode, um zum Beispiel die Korrektheit einer rekursiven Formulierung zu zeigen Kann auch in der Klausur drankommen! Einfaches Beispiel: zu zeigen ist n k=1 c = n c Induktionsanfang: Für n = 1 ist 1 k=1 c = c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 1 gilt für n = 1: 2 k=1 c = c + 1 k=1 c = c + 1 c = 2 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 2 gilt für n = 3: 3 k=1 c = c + 2 k=1 c = c + 2 c = 3 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 3 gilt für n = 4: 4 k=1 c = c + 3 k=1 c = c + 3 c = 4 c = n c Induktionsschritt allgemein: n n + 1 n+1 k=1 c = c + n k=1 c IV = c + n c = (n + 1) c 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 11 / 19

Induktionsbeweise Beweismethode, um zum Beispiel die Korrektheit einer rekursiven Formulierung zu zeigen Kann auch in der Klausur drankommen! Einfaches Beispiel: zu zeigen ist n k=1 c = n c Induktionsanfang: Für n = 1 ist 1 k=1 c = c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 1 gilt für n = 1: 2 k=1 c = c + 1 k=1 c = c + 1 c = 2 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 2 gilt für n = 3: 3 k=1 c = c + 2 k=1 c = c + 2 c = 3 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 3 gilt für n = 4: 4 k=1 c = c + 3 k=1 c = c + 3 c = 4 c = n c Induktionsschritt allgemein: n n + 1 n+1 k=1 c = c + n k=1 c IV = c + n c = (n + 1) c 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 11 / 19

Induktionsbeweise Beweismethode, um zum Beispiel die Korrektheit einer rekursiven Formulierung zu zeigen Kann auch in der Klausur drankommen! Einfaches Beispiel: zu zeigen ist n k=1 c = n c Induktionsanfang: Für n = 1 ist 1 k=1 c = c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 1 gilt für n = 1: 2 k=1 c = c + 1 k=1 c = c + 1 c = 2 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 2 gilt für n = 3: 3 k=1 c = c + 2 k=1 c = c + 2 c = 3 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 3 gilt für n = 4: 4 k=1 c = c + 3 k=1 c = c + 3 c = 4 c = n c Induktionsschritt allgemein: n n + 1 n+1 k=1 c = c + n k=1 c IV = c + n c = (n + 1) c 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 11 / 19

Induktionsbeweise Beweismethode, um zum Beispiel die Korrektheit einer rekursiven Formulierung zu zeigen Kann auch in der Klausur drankommen! Einfaches Beispiel: zu zeigen ist n k=1 c = n c Induktionsanfang: Für n = 1 ist 1 k=1 c = c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 1 gilt für n = 1: 2 k=1 c = c + 1 k=1 c = c + 1 c = 2 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 2 gilt für n = 3: 3 k=1 c = c + 2 k=1 c = c + 2 c = 3 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 3 gilt für n = 4: 4 k=1 c = c + 3 k=1 c = c + 3 c = 4 c = n c Induktionsschritt allgemein: n n + 1 n+1 k=1 c = c + n k=1 c IV = c + n c = (n + 1) c 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 11 / 19

Induktionsbeweise Beweismethode, um zum Beispiel die Korrektheit einer rekursiven Formulierung zu zeigen Kann auch in der Klausur drankommen! Einfaches Beispiel: zu zeigen ist n k=1 c = n c Induktionsanfang: Für n = 1 ist 1 k=1 c = c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 1 gilt für n = 1: 2 k=1 c = c + 1 k=1 c = c + 1 c = 2 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 2 gilt für n = 3: 3 k=1 c = c + 2 k=1 c = c + 2 c = 3 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 3 gilt für n = 4: 4 k=1 c = c + 3 k=1 c = c + 3 c = 4 c = n c Induktionsschritt allgemein: n n + 1 n+1 k=1 c = c + n k=1 c IV = c + n c = (n + 1) c 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 11 / 19

Induktionsbeweise Beweismethode, um zum Beispiel die Korrektheit einer rekursiven Formulierung zu zeigen Kann auch in der Klausur drankommen! Einfaches Beispiel: zu zeigen ist n k=1 c = n c Induktionsanfang: Für n = 1 ist 1 k=1 c = c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 1 gilt für n = 1: 2 k=1 c = c + 1 k=1 c = c + 1 c = 2 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 2 gilt für n = 3: 3 k=1 c = c + 2 k=1 c = c + 2 c = 3 c = n c Induktionsschritt: Unter Verwendung der Korrektheit der Formel für n = 3 gilt für n = 4: 4 k=1 c = c + 3 k=1 c = c + 3 c = 4 c = n c Induktionsschritt allgemein: n n + 1 n+1 k=1 c = c + n k=1 c IV = c + n c = (n + 1) c 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 11 / 19

Gauß sche Summenformel Zu zeigen: n k = k=1 n (n + 1) 2 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 12 / 19

Gauß sche Summenformel Zu zeigen: n k = k=1 n (n + 1) 2 Induktionsanfang: n = 1: 1 2 1 2 = 1 = k k=1 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 12 / 19

Gauß sche Summenformel Zu zeigen: n k = k=1 n (n + 1) 2 Induktionsanfang: n = 1: 1 2 1 2 = 1 = k k=1 Induktionsschritt: n n + 1 n+1 k = k=1 = = n k + (n + 1) IV = k=1 n (n + 1) 2 (n + 1) (n + 2) 2 n (n + 1) + (n + 1) 2 2 (n + 1) + = 2 n (n + 1) + 2 (n + 1) 2 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 12 / 19

Backtracking Vorgehensweise Live-Programmierung: Monopoly

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 2 3 4 3 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 1 4 2 3 3 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 1 4 2 3 3 1 4 2 3 3 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 1 4 2 3 3 1 2 4 2 3 3 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 1 4 2 3 3 1 2 4 2 3 3 1 2 4? 2 3 3 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 3 4 2 3 3 3 4 2 3 3 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 3 4 2 3 3 3 2 4 2 3 3 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 3 4 2 3 3 3 2 4 2 3 3 3 2 4 2 3 3 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Backtracking: Vorgehensweise Am Beispiel Sudoku: Per Rekursion wird jede Zelle des Sudoku (mehrfach!) besucht, es werden alle möglichen Zahlen für die Zelle bestimmt Die erste mögliche Zahl wird in das Feld geschrieben, dann wird rekursiv nach Lösungen dieses neuen Sudoku gesucht Wird für die erste mögliche Zahl keine Lösung gefunden, wird nacheinander die zweite, dritte, usw. mögliche Zahl eingesetzt und jedes mal rekursiv nach Lösungen gesucht Wichtig: Wird für keine der möglichen Zahlen eine Lösung gefunden, wird das Feld wieder auf leer zurückgesetzt! 3 4 2 3 3 3 2 4 2 3 3 3 2 4 1 4 1 2 3 2 3 1 4 1 4 3 2 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 14 / 19

Live-Programmierung: Monopoly Quelle: http://goo.gl/b1lfd 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 15 / 19

Klausuraufgabe zu Rekursion

Klausur 02/2009: Aufgabe 5 Zum deterministischen Testen von Anwendungen lassen sich Pseudo- Zufallszahlen verwenden. Folgende Berechnungsformel erzeugt für n 0 solche Zahlen: f (n) = n + 1 n < 3 1 + (((f (n 1) f (n 2)) f (n 3)) mod 100) sonst Hinweis: Der Modulo-Operator a mod b ergibt den Rest bei ganzzahliger Division und kann in Java durch % ausgedrückt werden. 1. Implementieren Sie die Funktion f rekursiv in Java. public static int f(int n) { 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 17 / 19

Klausur 02/2009: Aufgabe 5 Zum deterministischen Testen von Anwendungen lassen sich Pseudo- Zufallszahlen verwenden. Folgende Berechnungsformel erzeugt für n 0 solche Zahlen: f (n) = n + 1 n < 3 1 + (((f (n 1) f (n 2)) f (n 3)) mod 100) sonst Hinweis: Der Modulo-Operator a mod b ergibt den Rest bei ganzzahliger Division und kann in Java durch % ausgedrückt werden. 2. Implementieren Sie die Funktion f nun linear-rekursiv mit Durchreichen von Zwischenergebnissen. Gegeben ist die zugehörige Initialisierungsmethode, die Ihre Methode aufruft. public static int f(int n) { return lin(1, 2, 3, n); public static int lin(int a, int b, int c, int steps) { 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 18 / 19

Klausur 02/2009: Aufgabe 5 Zum deterministischen Testen von Anwendungen lassen sich Pseudo- Zufallszahlen verwenden. Folgende Berechnungsformel erzeugt für n 0 solche Zahlen: f (n) = n + 1 n < 3 1 + (((f (n 1) f (n 2)) f (n 3)) mod 100) sonst Hinweis: Der Modulo-Operator a mod b ergibt den Rest bei ganzzahliger Division und kann in Java durch % ausgedrückt werden. 3. Implementieren Sie eine iterative Java-Variante der Funktion f. public static int f(int n) { 15. November 2011 Jens Wetzl (jens.wetzl@cs.fau.de) Tafelübung Algorithmen und Datenstrukturen 19 / 19