Imperative Programmierung

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
Imperative Programmierung
Imperative Programmierung
der Universität Oldenburg
der Universität Oldenburg
der Universität Oldenburg

Rekursion Was ist Rekursion? Was sind rekursive Methoden?
Imperative Programmierung -Entwicklungswerkzeuge
Objektorientierte Programmierung
Imperative Programmierung
Objektorientierte Programmierung Definition von Klassen
der Universität Oldenburg
der Universität Oldenburg
der Universität Oldenburg
1 Computergestützte Verifikation Probleme bei der Softwareverifikation 1.komplexe Datentypen und Expressions 2.Pointer und dynamische Datenstrukturen.
Prinzipien des Algorithmenentwurfs Backtracking Prof. Dr. Th. Ottmann
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Imperative Programmierung Funktionen und Parameter
Imperative Programmierung
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher bekannt: Einfache Variable Feld Vereinbarung Zuweisung Block while-Schleife Bedingte Anweisung (if) Typ.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Thema des Informatikkurses der Klasse 8
Das Java-Hamstermodell
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
Rekursion Richard Göbel.


Wenn Programme Entscheidungen fällen müssen, dann …
Übungen zum Vortrag „Backtracking mit Heuristiken“
Rekursion mit Listen: Quicksort
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Einführung in die Programmierung
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Grundlagen der Informatik 4 Lehrstuhl für Betriebssysteme 1 Wie werden Funktionen realisiert? Beispiel: int maximum(int x, int y) { int j = x; if (y >
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
2.4 Rekursion Klassifikation und Beispiele
Prof. Dr.-Ing. Franz-Josef Behr
Kapitel 2: Grundelemente von Programmiersprachen
Algorithmen und Datenstrukturen Übungsmodul 8
© 2004 Pohlig Informatik Kurse © 2004 Pohlig Informatik Kurse Der Tramp tanzt die Rekursion zünderUntersuchen(…) Basisfall Rückmeldung:
Informatik Beschreibung von Abläufen durch Algorithmen 3.3 Wiederholugnsanweisungen 3. Beschreibung von Abläufen durch Algorithmen 3.3 Wiederholungsanweisungen.
Algorithmen und Datenstrukturen 1 SS 2002
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Rekursion-
Programmierkurs JavaUE 4 Anweisungen und ProgrammeDietrich BolesSeite 1 Programmierkurs Java Dr. Dietrich Boles Teil Imperative Programmierung Unterrichtseinheit.
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Binärer Suchbaum I-
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
Controller Werkstatt updaten Werkstatt ws = werkstattarray.get(werkstattId); ws.setName(name); ws.setAnsprechpartner(ansprechpartner); ws.setTelefonnummer(telefonnummer);
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Funktionale Programmierung.
2.4 Rekursion Klassifikation und Beispiele
Rekursion – Speicherverwaltung
Einführung in die Programmierung
REKURSION + ITERATION.
 Präsentation transkript:

Imperative Programmierung Programmierkurs Java Teil Imperative Programmierung Unterrichtseinheit 16 Rekursion Dr. Dietrich Boles

Gliederung Rekursion Definitionen Rekursive Prozeduren Rekursive Funktionen Lokale Variablen Parameter Endlosrekursion Anmerkungen Beispiele Backtracking Zusammenfassung

Rekursion (1) "Definition eines Problems, einer Funktion oder eines Verfahrens durch sich selbst" bereits bekannt: direkt rekursive Syntaxdiagramme/EBNF: indirekt rekursive Syntaxdiagramme/EBNF: Mathematik: <boolescher Ausdruck> :: "true" | "false" | "(" <boolscher Ausdruck> ")" ; <Anweisung> ::= ... | <while-Anweisung> ; <while-Anweisung> ::= "while" "(" <bA> ")" <Anweisung> ; { n! = 1 falls n = 0 n * (n-1)! sonst

Rekursion (2) Spielzeug: Quelle: German Wikipedia Matroschka

Rekursion (3) Kunst: M.C. Escher; Bildgalerie

Rekursion (4) Fraktale: Pythagoras-Baum Quelle: German Wikipedia

Rekursion (5) Mandelbrotmenge Fraktale: Quelle: German Wikipedia, Wolfgag Beyer Mandelbrotmenge http://www.mathematik.ch/anwendungenmath/fractal/julia/MandelbrotApplet.php

Definitionen (1) Definition (Rekursion): Eine Funktion heißt rekursiv, wenn sie während ihrer Abarbeitung erneut aufgerufen wird. Definition (direkte Rekursion): Eine Funktion heißt direkt rekursiv, wenn der erneute Aufruf im Funktionsrumpf der Funktion erfolgt. Definition (indirekte Rekursion): Eine Funktion heißt indirekt rekursiv, wenn der erneute Aufruf nicht im Funktionsrumpf der Funktion selbst sondern in einer anderen Funktion erfolgt.

Definitionen (2) Definition (Funktionsinkarnation): konkreter Aufruf einer Funktion Definition (Rekursionstiefe): Anzahl der aktuellen Inkarnationen einer Funktion minus 1 Definition (Variableninkarnation): konkrete Ausprägung (Speicherplatz) einer Variablen Iterativer Algorithmus: Algorithmus, der Wiederholungsanweisungen verwendet Rekursiver Algorithmus: Algorithmus, der rekursive Funktionen verwendet

Rekursive Prozeduren (1) Der Hamster soll bis zur nächsten Wand laufen! Iterative Lösung: Direkt rekursive Lösung: void zurMauer() { while (vornFrei()) vor(); } void zurMauerR() { if (vornFrei()) { vor(); zurMauerR(); }

Rekursive Prozeduren (2) Der Hamster soll alle Körner auf dem aktuellen Feld einsammeln! Iterative Lösung: Direkt rekursive Lösung: void sammle() { while (kornDa()) nimm(); } void sammleR() { if (kornDa()) { nimm(); sammleR(); }

Rekursive Prozeduren (3) Der Hamster soll bis zur nächsten Wand und dann zurück zur Ausgangsposition laufen! Iterative Lösung: void hinUndZurueck() { int anzahl = 0; while (vornFrei()) { vor(); anzahl++; } linksUm(); linksUm(); while (anzahl > 0) { anzahl--;

Rekursive Prozeduren (4) Der Hamster soll bis zur nächsten Wand und dann zurück zur Ausgangsposition laufen! Direkt rekursive Lösung: void hinUndZurueckR() { if (vornFrei()) { vor(); hinUndZurueckR(); } else { kehrt(); } void kehrt() { linksUm();

Rekursive Prozeduren (5) Schema: main: hUZR (1.) hUZR (2.) hUZR (3.) hUZR(); vornFrei -> t vor(); hUZR(); -----> vornFrei -> t hUZR(); -----> vornFrei -> f kehrt(); <----- Befehlsfolge: vor(); vor(); kehrt(); vor(); vor();

Rekursive Prozeduren (6) Der Hamster soll bis zur nächsten Wand und dann zurück zur Ausgangsposition laufen! Indirekt rekursive Lösung: void hinUndZurueckR() { if (vornFrei()) { laufe(); } else { linksUm(); linksUm(); } void laufe() { vor(); hinUndZurueckR();

Rekursive Funktionen (1) Der Hamster soll die Anzahl an Schritten bis zur nächsten Mauer zählen! Iterative Lösung: Rekursive Lösung: int anzahlSchritte() { int anzahl = 0; while (vornFrei()) { vor(); anzahl++; } return anzahl; int anzahlSchritteR() { if (vornFrei()) { vor(); return anzahlSchritteR() + 1; } else return 0; }

Rekursive Funktionen (2) Schema: main: aSR (1.) aSR (2.) aSR (3.) i=aSR(); vornFrei -> t vor(); aSR() -----> vornFrei -> t aSR() -----> vornFrei -> f return 0; <----- return 0 + 1; 1 return 1 + 1; 2 i=2;

Lokale Variablen Der Hamster soll die Anzahl an Körnern im Maul zählen! int anzahlKoernerR() { if (!maulLeer()) { int anz = 0; gib(); anz = anzahlKoernerR(); nimm(); // Vermeidung von Seiteneffekten! return anz + 1; } else return 0; } Speicher aKR anz aKR anz aKR anz ... aKR anz aKR anz aKR anz main main main main

... Parameter Der Hamster soll "anz"-Schritte nach vorne gehen! void vorR(int anz) { if ((anz > 0) && vornFrei()) { vor(); vorR(anz-1); } Speicher vorR anz=0 vorR anz=1 vorR anz=1 ... vorR anz=2 vorR anz=2 vorR anz=2 main main main main

Endlosrekursion Endlosrekursion: Rekursionstiefe: im Prinzip "unendlich"! erzeugt im allgemeinen einen Laufzeitfehler: Stack overflow! Dem Java-Interpreter kann man die gewünschte Stackgröße mitteilen! void sammleR() { if (kornDa()) { sammleR(); nimm(); }

Vorteile rekursiver Algorithmen: Anmerkungen Satz: zu jedem rekursiv formulierten Algorithmus gibt es einen äquivalenten iterativen Algorithmus Vorteile rekursiver Algorithmen: kürzere Formulierung leichter verständliche Lösung Einsparung von Variablen teilweise sehr effiziente Problemlösungen (z.B. Quicksort) Nachteile rekursiver Algorithmen: weniger effizientes Laufzeitverhalten (Overhead beim Funktionsaufruf) Verständnisprobleme bei Programmieranfängern Konstruktion rekursiver Algorithmen "gewöhnungsbedürftig"

Beispiel 1 Anzahl an Ziffern einer Zahl ermitteln: static int length(int zahl) { // iterativ if (zahl == 0) return 1; int laenge = 0; while (zahl != 0) { zahl /= 10; laenge++; } return laenge; static int lengthR(int zahl) { // rekursiv if (zahl >= -9 && zahl <= 9) return 1; return lengthR(zahl/10) + 1;

{ Beispiel 2 Berechnung der Fakultätsfunktion: n! = 1 falls n = 0 n * (n-1)! sonst static int fak(int n) { if (n <= 0) return 1; else return n * fak(n-1); } fak(3) = 3 * fak(2) 2 * fak(1) 1 * fak(0) 1 1 * 1 2 * 1 3 * 2 6

{ Beispiel 3 Berechnung einer Fibonacci-Zahl: 1 falls n = 1 fib(n) = 1 falls n = 2 fib(n-1) + fib(n-2) sonst static int fib(int n) { if (n <= 2) return 1; else return fib(n-1) + fib(n-2); }

Beispiel 4 Demo Türme von Hanoi: Gegeben: 3 Pfosten mit n Scheiben Ziel: Lege alle n Scheiben von 1 nach 3 Restriktion 1: immer nur eine Scheibe bewegen Restriktion 2: niemals größere auf kleinere Scheibe 1 2 3 http://thinks.com/java/hanoi/hanoi.htm class Hanoi { public static void main(String[] args) { int hoehe = IO.readInt("Hoehe: "); verlegeTurm(hoehe, 1, 3, 2); } static void verlegeTurm(int hoehe, int von, int nach, int ueber) { if (hoehe > 0) { verlegeTurm(hoehe-1, von, ueber, nach); IO.println(von + "-" + nach); verlegeTurm(hoehe-1, ueber, nach, von); } } } Demo

Backtracking-Verfahren (1) Prinzip: Versuch, eine Teillösung eines gegebenen Problems systematisch zu einer Gesamtlösung auszubauen falls in einer gewissen Situation ein weiterer Ausbau einer vorliegenden Teillösung nicht mehr möglich ist ("Sackgasse"), werden eine oder mehrere der letzten Teilschritte rückgängig gemacht die dann erhaltene reduzierte Teillösung versucht man auf einem anderen Weg wieder auszubauen Wiederholung des Verfahrens, bis Lösung gefunden wird oder man erkennt, dass keine Lösung existiert Grundlage der Programmiersprache PROLOG! Bekannte Probleme: Springerproblem Acht-Damenproblem Labyrinthsuche

Backtracking-Verfahren (2) Aufgabe: Der Hamster steht am Eingang eines zyklenfreien Labyrinths, in dem er ein Korn finden und auf dem schnellsten Weg zurücktransportieren soll! Demo

Backtracking-Verfahren (3) void main() { durchsucheLabyrinth(); } boolean durchsucheLabyrinth() { if (kornDa()) { nimm(); kehrt(); // mach dich auf den Heimweg return true; if (linksFrei() && durchsucheTeilLabyrinthLinks()) { if (rechtsFrei() && durchsucheTeilLabyrinthRechts()) {

Backtracking-Verfahren (4) if (!vornFrei()) { kehrt(); // Sackgasse return false; } return durchsucheTeilLabyrinthVorne(); boolean durchsucheTeilLabyrinthLinks() { linksUm(); vor(); boolean gefunden = durchsucheLabyrinth(); // Ausgangsposition einnehmen return gefunden;

Backtracking-Verfahren (5) boolean durchsucheTeilLabyrinthRechts() { rechtsUm(); vor(); boolean gefunden = durchsucheLabyrinth(); // Ausgangsposition einnehmen return gefunden; } boolean durchsucheTeilLabyrinthVorne() { // Seiteneffekt: Hamster schaut in andere Richtung // + Hilfsfunktionen

Zusammenfassung Rekursive Funktionen: Funktionen, die während ihrer Abarbeitung erneut aufgerufen werden Backtracking-Verfahren: Problemlösungsverfahren, das rekursiv Teilwege durchforstet, um eine Lösung zu finden