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

Ähnliche Dokumente
Rekursion. Dr. 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

Kontrollstrukturen: Wiederholungsanweisungen

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

Grafische Benutzeroberflächen

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

Statische Methoden, Vererbung, Benutzereingabe

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

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

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

Erste Java-Programme (Scopes und Rekursion)

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

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

Nachklausur Bitte in Druckschrift leserlich ausfüllen!

Fakultät IV Elektrotechnik/Informatik

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 17/18. Syntax. Philipp Wendler

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

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

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

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

2 Programmieren in Java I noch ohne Nachbearbeitung

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

Programmiertechnik Übungen zu Klassen & -methoden

Vorkurs Informatik WiSe 17/18

Elementare Konzepte von

Programmierung für Mathematik HS11

Programmierkurs Java

Vorkurs Informatik WiSe 16/17

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

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

Martin Unold INFORMATIK. Geoinformatik und Vermessung

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

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

II.3.1 Rekursive Algorithmen - 1 -

Klassenvariablen, Klassenmethoden

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

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

Stack. Seniorenseminar Michael Pohlig

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

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

Übung Informatik I - Programmierung - Blatt 3

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

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

Musterlösung Stand: 5. Februar 2009

Beispielprüfung CuP WS 2015/2016

Programmieren 1 C Überblick

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

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

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

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

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

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

Institut fu r Informatik

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

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

3. Anweisungen und Kontrollstrukturen

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

12. Rekursion Grundlagen der Programmierung 1 (Java)

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

Informatik I: Einführung in die Programmierung

Implementieren von Klassen

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

Übungspaket 22 Rekursive Funktionsaufrufe

Abschnitt 11: Korrektheit von imperativen Programmen

Transkript:

Annabelle Klarl Zentralübung zur Vorlesung Einführung in die Informatik: http://www.pst.ifi.lmu.de/lehre/wise-13-14/infoeinf WS13/14

Action required now 1. Smartphone: installiere die App "socrative student" oder Laptop: öffne im Browser m.socrative.com 2. Betrete den Raum 16485 16485. 3. Beantworte die erste Frage sofort! 2

Divide et Impera im Römischen Reich Einführung in die Informatik 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. 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 Dieses Vorgehen muss für alle n gleich sein! schwieriger Fall: Wenn ich den Wert von (n-1)! kenne, gilt: n! = (n-1)! * n 4

am Beispiel Raum: 16485 16485 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. 5

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 6

Aufgabe 1: Potenzfunktion (rekursiv) Einführung in die Informatik public static int potrek(int a, int n) { if (n == 0) return 1; else return a * potrek(a, n - 1); Induktive Definition: a n = 1, falls n = 0, a n = a * a n-1, falls n > 0 7

Aufgabe 1: Potenzfunktion (rekursiv): Beispiel 5 3 public static int potrek(int a, int n) { if (n == 0) else return 1; 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 8

Aufgabe 1: Potenzfunktion (iterativ) Einführung in die Informatik 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 9

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! 10

Vergleich von und Iteration Raum: 16485 16485 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. 11

Aufgabe 2: Gewinnchance beim Lotto Einführung in die Informatik Wie viele Möglichkeiten gibt es, 6 Zahlen aus gegebenen 49 Zahlen auszuwählen? Entwickeln Sie einen rekursiven Algorithmus. 12

Aufgabe 2: Lotto (klassische Berechnung) Aus der Statistik ist bekannt, dass es n Teilmengen mit k k Elementen aus einer Menge mit n Elementen gibt: moeglichkeiten(k,n)= n k für 1 k n Berechnung mit Binomialkoeffizient: n k = n! k! n k! moeglichkeiten(6,49)= 49 6 = 49! 6! 49 6! = (49 48 47 1) 6 5 1 (43 42 1) 13

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) 14

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 15

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, moeglichkeiten(k,n) = falls k=n moeglichkeiten(k,n-1) + moeglichkeiten(k-1,n-1), sonst 16

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 17

Aufgabe 2: Lotto (rekursiv) Raum: 16485 16485 Welchen Nachteil hat diese rekursive Lösung? public static int moeglichkeiten(int k, int n) { if (k == 1) return n; else if (k == n) return 1; 1 k n 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. 18