Institut fu r Informatik

Ähnliche Dokumente
II.3.1 Rekursive Algorithmen - 1 -

Vorkurs Informatik WiSe 16/17

Speicher und Adressraum

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

Programmierkurs Java

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

Informatik B von Adrian Neumann

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

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

Institut fu r Informatik

Institut fu r Informatik

1 2 3 Bewege Stapel von links nach rechts. In jedem Zug darf genau ein Ring bewegt werden. Es darf nie ein größerer auf einen kleineren Ring gelegt we

12. Rekursion Grundlagen der Programmierung 1 (Java)

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

6 Speicherorganisation

Probeklausur: Programmierung WS04/05

Türme von Hanoi. Worum geht es? Iterativer Algorithmus

Rekursive Funktionen

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Ausdrücke und primitive Typen

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

Repetitorium Informatik (Java)

Datenstrukturen und Algorithmen

JAVA - Rekursion

public class SternchenRechteckGefuellt {

Probeklausur: Programmierung WS04/05

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Grundlagen der Programmierung in C Funktionen

Tutoraufgabe 1 (Programmanalyse):

Einführung in die Java- Programmierung

Java Einführung Methoden. Kapitel 6

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Übungen zur Vorlesung EidP (WS 2015/16) Blatt 6

Institut fu r Informatik

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

Technische Universität München WS 2012/13 Fakultät für Informatik Lösungsvorschläge zu Blatt 4 Dr. C. Herzog, M. Maalej 12.

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

Algorithmen & Programmierung. Rekursive Funktionen (1)

Grundzüge der Wirtschaftsinformatik WS 2002/03. Wiederholung Java. Programmierzyklus. Heiko Rossnagel Problem

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Übungen Programmieren 1 Felix Rohrer. Übungen

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

Javakurs für Anfänger

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

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

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

Java Kurs für Anfänger Einheit 5 Methoden

Grundlagen der Programmierung

11. Rekursion, Komplexität von Algorithmen

Selbsteinstufungstest Vorkurs Programmieren

Einstieg in die Informatik mit Java

Einführung in die Java- Programmierung

Institut für Informatik

1 Vom Problem zum Programm

Propädeutikum zur Programmierung

5. Tutorium zu Programmieren

PIWIN 1 Übung Blatt 5

JAVA - Methoden - Rekursion

Java I Vorlesung Objektorientiertes Programmieren

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

Rekursive Algorithmen

Institut für Informatik

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

JAVA - Suchen - Sortieren

Dynamische Programmierung. Problemlösungsstrategie der Informatik

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

Übungsblatt 3: Algorithmen in Java & Grammatiken

Tutoraufgabe 1 (Überladen von Methoden):

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

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Übungsblatt 4. Java Vorkurs (WS 2015)

Kontrollstrukturen und Funktionen in C

Einführung in die Programmierung für Wirtschaftsinformatik

Programmierkurs Python I

Einstieg in die Informatik mit Java

Objektorientierte Programmierung

Programmiertechnik Klassenmethoden

Prof. H. Herbstreith Fachbereich Informatik. Leistungsnachweis. Informatik 1 WS 2001/2002

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

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

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Arrays und Methoden. Programmiervorkurs WS 2010 / 11

Programmentwicklung I für Hörer anderer Fachrichtungen -Wintersemester 2003/04- Abschlussklausur

Präzedenz von Operatoren

Android will doch nur spielen. Java Übung

Tutoraufgabe 1 (Programmanalyse):

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Allgemeine Informatik II SS :30-13:30 Uhr

JAVA - Methoden

Einführung in die Programmierung Vorlesungsprüfung

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

Klausur in Programmieren

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

CEN1112 Labor Software-Entwicklung

Aufgabenblatt 1: - Präsenzübung für die Übungen Do Mi Ausgabe Mi

Transkript:

Technische Universita t Mu nchen Institut fu r Informatik Lehrstuhl fu r Bioinformatik Einfu hrung in die Programmierung fu r Bioinformatiker Prof. B. Rost, L. Richter WS 2013/14 Aufgabenblatt 5 2. Dezember Methoden und Rekursion 5.1 (U ) Fragen zu Methoden (Wiederholung) (a) Was fu r Vorteile hat das Programmieren mit Methoden? (b) Was sind lokale Variablen in Methoden? Was sind Parameter? (c) Was ist mit dem U berladen von Methoden gemeint? (d) Was ist der Ru ckgabetyp einer Methode? Welche Rolle spielt hierbei das Schlu sselwort return? 5.2 (U ) Fragen zu Rekursion (a) Was versteht man unter Rekursion? (b) Was versteht man unter Endrekursion? (c) Kann man jedes iterative Problem in einen rekursiven Algorithmus u berfu hren? Wie sieht es mit der entgegengesetzten Richtung aus? (d) Was macht die folgende Funktion? void func ( int a ) { func ( a ); (e) Wie verhalten sich Parameter und lokale Variablen in Methoden bei erneuten Aufrufen derselben Methode? Verdeutlichen Sie dies am Beispiel der Fakulta tsfunktion: int fak ( int n ) { if ( n <= 1) { return 1; else { int tmp = n * fak ( n - 1); return tmp ; 5.3 (U ) Rekursion Betrachten Sie das folgende Programm: 1

public class Print { public static void main ( String [] args ) { print (3, 0); static void print ( int i, int depth ) { System. out. println (" start : depth = " + depth + ", i = " + i); if (i > 1) { print (i - 1, depth + 1); System. out. println (" end : depth = " + depth + ", i = " + i); (a) Überlegen Sie sich, welche Ausgabe der Aufruf print(3, 0) auf der Konsole erzeugt und notieren Sie sich diese auf einem Zettel. (b) Das abgedruckte Programm ist im Archiv zum Übungsblatt enthalten. Übersetzen Sie das Programm und führen Sie es anschließend aus, um die Programmausgabe mit der von Ihnen erwarteten Ausgabe zu vergleichen. (c) Überlegen Sie sich, wie sich die Ausgabe ändern würde, wenn im Anschluss an den rekursiven Aufruf print(i - 1, depth + 1) eine zusätzliches Statement print(i - 2, depth + 1) eingefügt würde. Notieren Sie sich wiederum die von Ihnen erwartete Ausgabe und passen Sie danach das Programm an, um Ihre Vermutung mit der tatsächlichen Ausgabe vergleichen zu können. 5.4 (Ü) Fibonacci-Folge Die Folge der Fibonacci-Zahlen ist definiert als: n 0 = 0 n 1 = 1 n i = n i 1 + n i 2 für i > 1 Schreiben Sie ein Programm Fibonacci, das nach Eingabe des Index i die Fibonaccizahl n i berechnet und ausgibt. Implementieren Sie dazu sowohl eine rekursive als auch eine iterative Lösung in den jeweiligen Methoden beziehungsweise public static long recursive(long i) public static long iterative(long i) Vergleichen Sie die beiden Lösungen hinsichtlich ihrer Laufzeit. Wie unterscheiden sich beide Lösungen hinsichtlich großer 1 i? 1 Wirklich gross! 2

5.5 (Ü) Türme von Hanoi Spielprinzip Das Spiel besteht aus drei Stäben A, B und C, auf die mehrere gelochte Scheiben gelegt werden, die alle verschieden groß sind. Zu Beginn liegen alle Scheiben auf Stab A der Größe nach geordnet mit der größten Scheibe unten und der kleinsten Scheibe oben. Ziel des Spieles ist es, den kompletten Scheiben-Stapel von A nach C zu versetzen. Bei jedem Zug darf die oberste Scheibe eines beliebigen Stabes auf einen der beiden anderen Stäbe gelegt werden, vorausgesetzt, dort liegt nicht schon eine kleinere Scheibe. Folglich sind zu jedem Zeitpunkt des Spieles die Scheiben auf jedem Feld der Größe nach geordnet. Aufgabe: Machen Sie sich mit dem Spielprinzip vertraut und versuchen Sie gemeinsam auf die Lösung des Spieles zu kommen. Erweitern Sie anschließend die Funktion move(...), so dass für eine beliebige Menge von Steinen die Einzelschritte (z.b. Move top stone from A to B. ) zur Lösung des Spiels auf der Konsole ausgegeben werden. 5.6 (H) Tagerechner (+++) Ziel dieser Aufgabe ist es, einen Tagerechner zu programmieren, mit dem man beispielsweise berechnen kann, welches Datum n Tage nach einem bestimmten Datum liegt. Nach dem Prinzip Divide and Conquer ( Teile und Herrsche ) sollen die Aufgaben in verschiedene Funktionen der Klasse DayCalculator zerlegt werden, bei der jede spätere Funktion (soweit möglich) die vorangegangenen nutzen soll. Implementieren Sie dazu folgende Funktionen und achten Sie darauf, dass Sie exakt die jeweils angegebene Funktions-Signatur 2 verwenden. (a) public static boolean isleapyear(int y) Prüft, ob es sich bei der Jahresangabe y um ein Schaltjahr handelt. Die Regel dabei lautet, dass alle durch 4 teilbaren Jahre Schaltjahre sind (z.b. 1996), außer wenn sie ebenfalls durch 100 teilbar sind (z.b. 1900). Durch 400 teilbare Jahre bilden davon wiederum eine Ausnahme und sind Schaltjahre (z.b. 2000). (b) public static int daysinyear(int y) und public static int daysinmonth(int m, int y) Geben an, wieviele Tage es in einem Jahr y gibt bzw. wieviele Tage es im Monat m eines bestimmten Jahres y gibt. (c) public static boolean isvaliddate(int d, int m, int y) Prüft, ob das angegebene Datum mit Tag d, Monat m und Jahr y existiert. (d) public static String getdateasstring(int d, int m, int y) Gibt das Datum im Format 1.11.2009 als String zurück. Bei einem unzulässigen Datum soll die Zeichenkette Invalid Date zurückgegeben werden. (e) public static int remainingdaysinmonth(int d, int m, int y) Gibt an, wieviele Tage abzüglich des gegebenen Datums im Monat verbleiben. Bei einem 2 d.h. korrekte Verwendung von Schlüsselworten, richtiger Rückgabetyp, korrekter Funktionsname (inkl. Groß- und Kleinschreibung) sowie richtige Anzahl, Reihenfolge und Typen der Funktionsparameter 3

unzulässigen Datum soll der Wert 0 zurückgegeben werden. (f) public static int remainingdaysinyear(int d, int m, int y) Gibt an, wieviele Tage abzüglich des gegebenen Datums im Jahr verbleiben. Bei einem unzulässigen Datum soll der Wert 0 zurückgegeben werden. (g) public static String daysadd(int d, int m, int y, int numdays) Gibt an, welches Datum numdays Tage hinter dem angegebenen Datum liegt. Das Ergebnis soll auf der Konsole ausgegeben werden. Falls das initiale Datum unzulässig ist, soll die Zeichenkette Invalid Date zurückgegeben werden. (h) Sofern noch nicht geschehen, soll die Funktion daysadd so erweitert werden, dass auch negative Zahlen zulässig sind. (i) Kommentieren Sie alle Funktionen inklusive aller Parameter und Rückgabewerte entsprechend der JavaDoc-Richtlinien. Anmerkungen: Sie dürfen für diese Aufgabe natürlich nicht auf die Klasse Calendar aus der Standardbibliothek zurückgreifen. Für die Teilaufgaben (g) ist es sinnvoll, sich vorab einen Algorithmus zu überlegen, wie man für beliebige Parameter möglichst einfach und schnell zum Ergebnis kommt. Versuchen Sie dabei, nach dem Prinzip Teile und Herrsche das allgemeine Problem in Teilaufgaben zu zerlegen, die einfach zu implementieren sind. Versuchen Sie bei der Teilaufgabe (h), einen möglichst einfachen Weg für die Lösung des Problems zu finden. 5.7 (H) Ackermann-Funktion (++) Die Ackermann-Funktion ist definiert als: n + 1 für m = 0 m, n N 0 : ack(m, n) := ack(m 1, 1) für n = 0 ack(m 1, ack(m, n 1)) sonst Sie liefert sehr schnell sehr große Ergebnisse und Verschachtelungstiefen. Schreiben Sie ein Programm Ackermann, das Werte für m und n mittels Tools.readInt() einliest und eine kleine Tabelle für alle Ergebnisse zwischen 0 und der Benutzereingabe ausgibt. Kann ein Tabelleneintrag nicht mit maximal 10.000.000 Funktionsaufrufen berechnet werden, soll an dieser Stelle ein x ausgegeben werden. Implementieren Sie hierfür die Funktion public static int recursiveack(int m, int n) Beispiel für m=4 und n=4: m\n 0 1 2 3 4 0: 1 2 3 4 5 1: 2 3 4 5 6 2: 3 5 7 9 11 4

3: 5 13 29 61 125 4: 13 x x x x 5