Rekursion. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Ähnliche Dokumente
Rekursion. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

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

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

Kontrollstrukturen: Wiederholungsanweisungen

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Kontrollstrukturen: Wiederholungsanweisungen

Erste Java-Programme (Scopes und Rekursion)

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2016/17. Vorbereitende Aufgaben

Kontrollstrukturen: Wiederholungsanweisungen

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

2.4 Schleifen. Schleifen unterscheiden sich hinsichtlich des Zeitpunktes der Prüfung der Abbruchbedingung:

2 Programmieren in Java I noch ohne Nachbearbeitung

Nachklausur Bitte in Druckschrift leserlich ausfüllen!

Fakultät IV Elektrotechnik/Informatik

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

Programmiertechnik Übungen zu Klassen & -methoden

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

Vorkurs Informatik WiSe 17/18

Arrays von Objekten. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Programmierung für Mathematik HS11

Programmierkurs Java

II.3.1 Rekursive Algorithmen - 1 -

Elementare Konzepte von

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

1. Teilklausur Gruppe A. Bitte in Druckschrift leserlich ausfüllen!

Tag 5. Repetitorium Informatik (Java) Dozent: Marius Kamp Lehrstuhl für Informatik 2 (Programmiersysteme)

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Klassen, Vererbung, Benutzereingabe

Vorkurs Informatik WiSe 16/17

Stack. Seniorenseminar Michael Pohlig

Institut fu r Informatik

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

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Übung Informatik I - Programmierung - Blatt 3

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

Vorlesung Programmieren

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

Informatik I Tutorium WS 07/08

Statische Methoden, Vererbung, Benutzereingabe

Musterlösung Stand: 5. Februar 2009

Statische Methoden, Vererbung, Benutzereingabe

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

Klassenvariablen, Klassenmethoden

Klassen, Vererbung, Benutzereingabe

Übungsblatt 5. Thema: Algorithmen: Rekursion vs Iteration, O-Notation, Korrektheit

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Einführung in die Programmierung. (K-)II/Wb17

5. Algorithmen. K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16

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

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

Implementieren von Klassen

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015. Musterlösung

Informatik I: Einführung in die Programmierung

Abschnitt 11: Korrektheit von imperativen Programmen

1. Teilklausur. Name:... Vorname:... Matrikel-Nummer:...

Klassen und Objekte. Klassen sind Vorlagen für Objekte. Objekte haben. Attribute. Konstruktoren. Methoden. Merkblatt

Beispielprüfung CuP WS 2015/2016

Zentralübung Grundlagen der Programmierung

12. Rekursion Grundlagen der Programmierung 1 (Java)

Grunddatentypen, Ausdrücke und Variablen

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

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

Thomas Gewering Benjamin Koch Dominik Lüke. (geschachtelte Schleifen)

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

Übung Grundlagen der Programmierung WS 2008/09. Übung 04: Methoden. Abgabetermin: Prosabeschreibung Java-Programm.

Kapitel 7: Rekursion. Inhalt. Rekursion: Technik Rekursion vs. Iteration

Klausur "ADP" WS 2013/2014

Computeranwendung und Programmierung (CuP)

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

OOP Aufgabenblatt 7 6. Dezember 2013

Variablenarten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Einführung in die Programmierung für NF. Rückgabewerte, Fallunterscheidung, Schleifen

3. Anweisungen und Kontrollstrukturen

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Kasparov versus Deep Blue. Till Tantau. Institut für Theoretische Informatik Universität zu Lübeck

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Java für Anfänger Teil 4: Anweisungen. Programmierkurs Manfred Jackel

Objektorientierte Programmierung OOP Programmieren mit Java

Student: Alexander Carls Matrikelnummer: Aufgabe: Beschreibung des euklidischen Algorithmus Datum:

Praktische Informatik I WS 1999/2000

Wiederholungsblatt Einführung in die Programmierung Lösungen

Grafische Benutzeroberflächen

Einführung in die Programmierung

Datenstrukturen. Mariano Zelke. Sommersemester 2012

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

8 Anwendung: Suchen. Folge a ganzer Zahlen; Element x. Wo kommt x in a vor?

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Abschlussklausur. Lösung

Programmieren 1 C Überblick

Test-Driven Design: Ein einfaches Beispiel

Welche Informatik-Kenntnisse bringen Sie mit?

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

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Transkript:

Dr. Philipp Wendler Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung WS18/19 https://www.sosy-lab.org/teaching/2018-ws-infoeinf/

Divide et Impera im Römischen Reich Die Lenkung des gesamten Römischen Reichs bedarf großer Entscheidungen für das ganze Reich, kleiner Entscheidungen für bestimmte Gebiete. http://www.ludenhausen.de/roemerzeit.htm 2

Divide et Impera im Römischen Reich Die Lenkung des gesamten Römischen Reichs bedarf großer Entscheidungen für das ganze Reich, kleiner Entscheidungen für bestimmte Gebiete. Divide et Impera: Teile das Reich in kleinere Gebiete. Koordiniere nur das Zusammenspiel aller Gebiete. Delegiere die Lenkung jedes Gebiets an einen Verantwortlichen. : Jeder Verantwortliche teilt seinen Verantwortungsbereich wieder in kleinere Gebiete auf, solange bis der Bereich überschaubar ist. http://www.ludenhausen.de/roemerzeit.htm 3

Allgemein Ein Algorithmus ist rekursiv, wenn in seiner Beschreibung derselbe Algorithmus wieder aufgerufen wird. 4

Allgemein Ein Algorithmus ist rekursiv, wenn in seiner Beschreibung derselbe Algorithmus wieder aufgerufen wird. Das Prinzip der wird folgendermaßen zur Lösung von Problemen eingesetzt (informell): In einfachen Fällen: "Ich weiß das Ergebnis sofort." In schwierigeren Fällen: "Wenn ich die Lösung eines kleineren Problems kenne (rekursiv), kann ich das Gesamtergebnis daraus berechnen." 5

Allgemein Das Prinzip der wird folgendermaßen zur Lösung von Problemen eingesetzt (informell): In einfachen Fällen: "Ich weiß das Ergebnis sofort." In schwierigeren Fällen: "Wenn ich die Lösung eines kleineren Problems kenne (rekursiv), kann ich das Gesamtergebnis daraus berechnen." z.b. aus der Vorlesung: einfacher Fall: 0! = 1 Ein Algorithmus ist rekursiv, wenn in seiner Beschreibung derselbe Algorithmus wieder aufgerufen wird. schwieriger Fall: Wenn ich den Wert von (n-1)! kenne, gilt: n! = (n-1)! * n 6

Allgemein Das Prinzip der wird folgendermaßen zur Lösung von Problemen eingesetzt (informell): In einfachen Fällen: "Ich weiß das Ergebnis sofort." In schwierigeren Fällen: "Wenn ich die Lösung eines kleineren Problems kenne (rekursiv), kann ich das Gesamtergebnis daraus berechnen." z.b. aus der Vorlesung: einfacher Fall: 0! = 1 Ein Algorithmus ist rekursiv, wenn in seiner Beschreibung derselbe Algorithmus wieder aufgerufen wird. Dieses Vorgehen muss für alle n gleich sein! schwieriger Fall: Wenn ich den Wert von (n-1)! kenne, gilt: n! = (n-1)! * n 7

am Beispiel Welche Aufgabe kann nicht rekursiv gelöst werden? a) Löffelweise Suppe essen: Falls der Teller leer ist, fertig; Ansonsten iss einen Löffel Suppe und beginne von vorne. b) Ein Auto am "Fließband" zusammenbauen Falls das Auto komplett ist, fertig; Ansonsten baue einen bestimmten Teil und beginne von vorne. c) Ein Viereck zeichnen Falls schon vier Kanten gezeichnet sind, fertig; Ansonsten zeichne eine Kante, drehe das Blatt um 90 und beginne von vorne. 8

Aufgabe 1: Potenzfunktion (Beispiel 5 4 ) Schreiben Sie eine Methode, die für zwei nicht-negative Zahlen a und n vom Typ int die Potenz a n berechnet. 9

Aufgabe 1: Potenzfunktion (Beispiel 5 4 ) Schreiben Sie eine Methode, die für zwei nicht-negative Zahlen a und n vom Typ int die Potenz a n berechnet. 5 4 = 5 * 5 * 5 * 5 1 (= 5 * 5 * 5 * 5 * 5 0 ) 5 4 = 5 * 5 * 5 2 5 4 = 5 * 5 3 10

Aufgabe 1: Potenzfunktion (Beispiel 5 4 ) Schreiben Sie eine Methode, die für zwei nicht-negative Zahlen a und n vom Typ int die Potenz a n berechnet. 5 4 = 5 * 5 * 5 * 5 1 (= 5 * 5 * 5 * 5 * 5 0 ) 5 4 = 5 * 5 * 5 2 5 4 = 5 * 5 3 n-mal Präzisierung: 5 n = 5 * * 5 = 5 * 5 n-1 11

Aufgabe 1: Potenzfunktion (Beispiel 5 4 ) Schreiben Sie eine Methode, die für zwei nicht-negative Zahlen a und n vom Typ int die Potenz a n berechnet. 5 4 = 5 * 5 * 5 * 5 1 (= 5 * 5 * 5 * 5 * 5 0 ) 5 4 = 5 * 5 * 5 2 5 4 = 5 * 5 3 n-mal Präzisierung: 5 n = 5 * * 5 = 5 * 5 n-1 Per Definition: 5 0 = 1 12

Aufgabe 1: Potenzfunktion (Beispiel 5 4 ) Schreiben Sie eine Methode, die für zwei nicht-negative Zahlen a und n vom Typ int die Potenz a n berechnet. 5 4 = 5 * 5 * 5 * 5 1 (= 5 * 5 * 5 * 5 * 5 0 ) 5 4 = 5 * 5 * 5 2 5 4 = 5 * 5 3 n-mal Präzisierung: 5 n = 5 * * 5 = 5 * 5 n-1 Per Definition: 5 0 = 1 Induktive Definition: a n = 1, falls n = 0, a n = a * a n-1, falls n > 0 13

Aufgabe 1: Potenzfunktion (rekursiv) Induktive Definition: a n = 1, falls n = 0, a n = a * a n-1, falls n > 0 public static int potrek(int a, int n) { if (n == 0) return 1; else return a * potrek(a, n - 1); 14

Aufgabe 1: Potenzfunktion (rekursiv): Beispiel 5 3 public static int potrek(int a, int n) { if (n == 0) return 1; else return a * potrek(a, n - 1); 1. Aufruf: a=5, n=3 potrek(5,3) 15

Aufgabe 1: Potenzfunktion (rekursiv): Beispiel 5 3 public static int potrek(int a, int n) { if (n == 0) return 1; else return a * potrek(a, n - 1); 1. Aufruf: a=5, n=3 potrek(5,3) 2. Aufruf: a=5, n=2 5 * potrek(5,2) 16

Aufgabe 1: Potenzfunktion (rekursiv): Beispiel 5 3 public static int potrek(int a, int n) { if (n == 0) return 1; else return a * potrek(a, n - 1); 1. Aufruf: a=5, n=3 potrek(5,3) 2. Aufruf: a=5, n=2 5 * potrek(5,2) 3. Aufruf: a=5, n=1 5 * (5 * potrek(5,1)) 17

Aufgabe 1: Potenzfunktion (rekursiv): Beispiel 5 3 public static int potrek(int a, int n) { if (n == 0) return 1; else return a * potrek(a, n - 1); 1. Aufruf: a=5, n=3 potrek(5,3) 2. Aufruf: a=5, n=2 5 * potrek(5,2) 3. Aufruf: a=5, n=1 5 * (5 * potrek(5,1)) 4. Aufruf: a=5, n=0 5 * (5 * (5 * potrek(5,0))) 18

Aufgabe 1: Potenzfunktion (rekursiv): Beispiel 5 3 public static int potrek(int a, int n) { if (n == 0) return 1; else return a * potrek(a, n - 1); 1. Aufruf: a=5, n=3 potrek(5,3) 2. Aufruf: a=5, n=2 5 * potrek(5,2) 3. Aufruf: a=5, n=1 5 * (5 * potrek(5,1)) 4. Aufruf: a=5, n=0 5 * (5 * (5 * potrek(5,0))) Rückgabewert: 1 5 * (5 * (5 * 1)); 19

Aufgabe 1: Potenzfunktion (rekursiv): Beispiel 5 3 public static int potrek(int a, int n) { if (n == 0) return 1; else return a * potrek(a, n - 1); 1. Aufruf: a=5, n=3 potrek(5,3) 2. Aufruf: a=5, n=2 5 * potrek(5,2) 3. Aufruf: a=5, n=1 5 * (5 * potrek(5,1)) 4. Aufruf: a=5, n=0 5 * (5 * (5 * potrek(5,0))) Rückgabewert: 1 5 * (5 * (5 * 1)); Ausrechnen 125 20

Aufgabe 1: Potenzfunktion (iterativ) public static int potiter (int a, int n) { int akk = 1; while (n > 0) { akk = a * akk; n = n - 1; return akk; Induktive Definition: a n = 1, falls n = 0, a n = a * a n-1, falls n > 0 21

Aufgabe 1: Potenzfunktion (iterativ): Beispiel 5 3 public static int potiter (int a, int n) { int akk = 1; while (n > 0) { akk = a * akk; n = n - 1; return akk; Aufruf: a=5, n=3 potiterativ(5,3); 22

Aufgabe 1: Potenzfunktion (iterativ): Beispiel 5 3 public static int potiter (int a, int n) { int akk = 1; while (n > 0) { akk = a * akk; n = n - 1; return akk; Aufruf: a=5, n=3 potiterativ(5,3); 1. Anweisung akk = 1, n = 3 23

Aufgabe 1: Potenzfunktion (iterativ): Beispiel 5 3 public static int potiter (int a, int n) { int akk = 1; while (n > 0) { akk = a * akk; n = n - 1; return akk; Aufruf: a=5, n=3 potiterativ(5,3); 1. Anweisung akk = 1, n = 3 1. Schleifendurchlauf akk = 5*1 = 5, n = 2 24

Aufgabe 1: Potenzfunktion (iterativ): Beispiel 5 3 public static int potiter (int a, int n) { int akk = 1; while (n > 0) { akk = a * akk; n = n - 1; return akk; Aufruf: a=5, n=3 potiterativ(5,3); 1. Anweisung akk = 1, n = 3 1. Schleifendurchlauf akk = 5*1 = 5, n = 2 2. Schleifendurchlauf akk = 5*5 = 25, n = 1 25

Aufgabe 1: Potenzfunktion (iterativ): Beispiel 5 3 public static int potiter (int a, int n) { int akk = 1; while (n > 0) { akk = a * akk; n = n - 1; return akk; Aufruf: a=5, n=3 potiterativ(5,3); 1. Anweisung akk = 1, n = 3 1. Schleifendurchlauf akk = 5*1 = 5, n = 2 2. Schleifendurchlauf akk = 5*5 = 25, n = 1 3. Schleifendurchlauf akk = 5*25 = 125, n = 0 26

Aufgabe 1: Potenzfunktion (iterativ): Beispiel 5 3 public static int potiter (int a, int n) { int akk = 1; while (n > 0) { akk = a * akk; n = n - 1; return akk; Aufruf: a=5, n=3 potiterativ(5,3); 1. Anweisung akk = 1, n = 3 1. Schleifendurchlauf akk = 5*1 = 5, n = 2 2. Schleifendurchlauf akk = 5*5 = 25, n = 1 3. Schleifendurchlauf akk = 5*25 = 125, n = 0 Schleifenabbruch! 27

Vergleich von und Iteration Welche Aussage ist richtig? a) Bei der Ausführung eines rekursiven Programms müssen möglicherweise viele Werte zwischengespeichert werden, da keine Zwischenergebnisse berechnet werden können. b) Mit können mehr Probleme gelöst werden als mit Iteration (Schleifen). c) Ein rekursives Programm terminiert immer, ein iteratives Programm möglicherweise nicht. 28

Aufgabe 2: Gewinnchance beim Lotto Wie viele Möglichkeiten gibt es, 6 Zahlen aus gegebenen 49 Zahlen auszuwählen? Entwickeln Sie einen rekursiven Algorithmus. 29

Aufgabe 2: Lotto (klassische Berechnung) 30

Aufgabe 2: Lotto (rekursive Lösungsidee) a. Jede Auswahl 6 aus 48 ist ebenfalls eine gültige Auswahl für 6 aus 49 (das sind alle Auswahlen, in denen 49 nicht vorkommt) b. Jede Auswahl 5 aus 48 zusammen mit der festen sechsten Zahl 49 ist ebenfalls eine Auswahl für 6 aus 49 (das sind alle Auswahlen, in denen 49 vorkommt) c. a. + b. liefert alle Auswahlen für 6 aus 49 31

Aufgabe 2: Lotto (rekursive Lösungsidee) a. Jede Auswahl 6 aus 48 ist ebenfalls eine gültige Auswahl für 6 aus 49 (das sind alle Auswahlen, in denen 49 nicht vorkommt) b. Jede Auswahl 5 aus 48 zusammen mit der festen sechsten Zahl 49 ist ebenfalls eine Auswahl für 6 aus 49 (das sind alle Auswahlen, in denen 49 vorkommt) c. a. + b. liefert alle Auswahlen für 6 aus 49 Also: moeglichkeiten(6,49) = moeglichkeiten(6,48) + moeglichkeiten(5,48) 32

Aufgabe 2: Lotto (rekursive Lösungsidee) Also: moeglichkeiten(6,49) = moeglichkeiten(6,48) + moeglichkeiten(5,48) Allgemein gilt für 1 k n: moeglichkeiten(k,n) = n, falls k=1 moeglichkeiten(k,n) = 1, falls k=n moeglichkeiten(k,n) = moeglichkeiten(k,n-1) + moeglichkeiten(k-1,n-1), sonst 33

Aufgabe 2: Lotto (rekursiv) public static int moeglichkeiten(int k, int n) { if (k == 1) return n; else if (k == n) return 1; else return moeglichkeiten(k,n-1) + moeglichkeiten(k-1,n-1); Allgemein gilt für 1 k n: moeglichkeiten(k,n) = n, falls k=1 moeglichkeiten(k,n) = 1, falls k=n moeglichkeiten(k,n) = moeglichkeiten(k,n-1) + moeglichkeiten(k-1,n-1), sonst 34

Aufgabe 2: Lotto (rekursiv) Die Methode kann folgendermaßen aufgerufen werden: public class Lotto { public static void main(string[] args) { long start = System.currentTimeMillis(); System.out.println(moeglichkeiten(6, 49)); long ende = System.currentTimeMillis(); System.out.println(ende - start); public static int moeglichkeiten(int k, int n) {... Nach 11 Millisekunden berechnet das Programm das Ergebnis: 13.983.816 Möglichkeiten 35

Aufgabe 2: Lotto (rekursiv) Welchen Nachteil hat diese rekursive Lösung? public static int moeglichkeiten(int k, int n) { 1 k n if (k == 1) return n; else if (k == n) return 1; else return moeglichkeiten(k,n-1) + moeglichkeiten(k-1,n-1); a) Das Programm terminiert für manche erlaubte Werte nicht. b) Das Programm liefert für manche erlaubte Werte ein falsches Ergebnis. c) Es werden Werte doppelt berechnet. 36