2.4 Rekursion Klassifikation und Beispiele

Slides:



Advertisements
Ähnliche Präsentationen
ALP II: Objektorientierte Programmierung Sommersemester 2006
Advertisements

der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
der Universität Oldenburg
Einführung in die Programmierung Zusammenfassung
Zusammenfassung der Vorwoche
Rekursionen Erstellt von J. Rudolf im November 2001 /
Rekursion Was ist Rekursion? Was sind rekursive Methoden?
Imperative Programmierung -Entwicklungswerkzeuge
Imperative Programmierung
der Universität Oldenburg
der Universität Oldenburg
Java: Objektorientierte Programmierung
Indirekte Adressierung
Java: Grundlagen der Objektorientierung
SWITCH - Anweisung.
WHILE - Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
DO...WHILE Anweisung.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 2 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
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
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
Praxis-Repetitorium JAVA zusätzliche, ergänzende Lehrveranstaltung
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0);
1DVG3 - anonyme Klassen Anonyme Klassen. DVG3 - anonyme Klassen 2 Syntax new BasisKlasse(Parameterliste) { Modifikationen und Erweiterungen der Basisklasse.
Abstrakte Klassen DVG
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Einführung in die Programmierung Anweisungen und Datentypen
Thema: Fibonacci-Zahlen
Bestimmung des ggT zweier Zahlen
Rekursive Funktionen (Fakultät)
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
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
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Aufruf einer Methode eines Objektes vom Typ „Bruch“
Kapitel 2: Grundelemente von Programmiersprachen
Algorithmen und Datenstrukturen Übungsmodul 8
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
CuP - Java Sechste Vorlesung Entspricht ungefähr Kapitel 3. 1 – 3
Programmierung von Agenten in Java: Implementierung einer Supply-Chain
Programmiervorkurs WS 2014/15 Methoden
Programmiervorkurs WS 2014/15 Schleifen
Programmiervorkurs WS 2014/15 Instanzmethoden
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
© 2004 Pohlig Informatik Kurse © 2004 Pohlig Informatik Kurse Der Tramp tanzt die Rekursion zünderUntersuchen(…) Basisfall Rückmeldung:
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Rekursion-
Unterprogramme / Methoden
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Java Programme nur ein bisschen objektorientiert.
2.4 Rekursion Klassifikation und Beispiele
 Präsentation transkript:

2.4 Rekursion 2.4.1 Klassifikation und Beispiele Begriff der Rekursion: allgemein: selbstbezüglicher Verweis, Selbstbezüglichkeit / Selbstähnlichkeit einer Struktur spezielle Bedeutung im Bereich Programmierung: Selbstaufruf einer Prozedur / Funktion Anmerkung: die Theorie rekursiver Funktionen im Sinne der Mathematik baut auch auf Rekursion auf.

Beispiele rekursiver Algorithmen: größter gemeinsamer Teiler (ggT) Eingaben a,b ganzzahlig, positiv algorithmus ggT(a,b: int)  int { wenn a=b dann rückgabe a; wenn b>a dann rückgabe ggT(b,a); rückgabe ggT(a-b,b) }

Fakultät einer nat. Zahl (fak) Eingabe n  0, ganzzahlig algorithmus fak(n: int)  int { wenn n=0 dann rückgabe 1 sonst rückgabe n•fak(n-1) }

Fibonacci-Folge (fibo) Eingabe n  0, ganzzahlig algorithmus fibo(n: int)  int { wenn (n=0 oder n=1) dann rückgabe n sonst rückgabe fibo(n-1)+fibo(n-2) }

Klassifikation (Rekursionstypen): endständige Rekursion Das rekursive Aufrufschema einer Prozedur oder Funktion heißt »endständig«, wenn auf jeder Aufrufebene maximal ein rekursiver Aufruf zur Ausführung gelangt und dieser Aufruf weder von weiteren Anweisungen gefolgt wird (d.h. letzte Anweisung) noch in andere Operationen als Rückgabe (return) eingebunden ist.

verzweigte (vs. lineare) Rekursion Ein rekursives Aufrufschema heißt verzweigt, wenn in bestimmten Fällen mehr als ein rekursiver Aufruf zur Ausführung auf einer Aufrufebene gelangt. Bei maximal einem rekursiven Aufruf pro Ebene heißt das rekursive Aufrufschema linear. indirekte (vs. direkte) Rekursion Als indirekte Rekursion wird der Selbstaufruf einer Prozedur "auf Umwegen" bezeichnet. Beispiel: Funktion F ruft (in bestimmten Fällen) G, G ruft H und H wiederum F auf.

Vor- und Nachteile der Rekursion kompakt, elegant abstrakt im math. Sinne Setzen von Variablen ohne Zuweisungen (stattdessen: Parameterübergabe). schwierig zu handhaben hohe Ablaufkomplexi-tät, besonders bei verzweigten Rekur- sionen Speicherbedarf für Rekursionskeller Effizienznachteil gegenüber Iteration.

Beispiel: "Partitionszahl" Definition: Die Partitionszahl P(n) einer natürlichen Zahl n ist die Anzahl der - unabhängig von der Reihenfolge der Summanden - verschiedenen additiven Zerlegungen von n (positive Summanden). Formal: P(n) := #( { {k1, … , kj} mit n = k1 + … + kj , 0 < ki  n} ) Hier ist {k1 ,..,kj } eine Multimenge, d.h. ein Element darf mehrfach vorkommen.

Problem: gegeben n, berechne P(n) ! Lösung: Rekursion. Definition: P(n,k) sei die Anzahl der additiven Zerlegungen von n mit positiven Summanden  k (hier sei n > 0 und k > 0). Dann: P(n) = P(n,n) und P(1,k) = 1 P(n,1) = 1 P(n,k) = P(n,n) für k > n P(n,n) = P(n,n-1)+1 P(n,k) = P(n,k-1) + P(n-k,k) für k < n

Beispiel Sei n = 5 und k = 3 P(5,3) = P(5,2) + P(2,2)

In Java: public class Parti { private static int String2Int(String s)   { Integer I = new Integer(s);     return I.intValue();   }   private static int P(int n, int k)   { if ( n == 1 ) return 1;     if ( k == 1) return 1;     if ( k > n ) return P(n,n);     if ( k == n) return P(n,n-1) + 1;     return P(n,k-1) + P(n-k,k);   }   public static void main(String[] args) {     int n = String2Int(args[0]);     System.out.println("------------");     System.out.println("P("+n+") = "+P(n,n));     System.out.println("------------");   } }

Verifikationskriterien: Vollständigkeit der Fallunterscheidung Korrektheit des Ergebnisses in terminalen Fällen Korrektheit der Reduktionsschritte (Fälle) Sicherstellung der Reduktion auf den terminalen Fall in endlich vielen Schritten

2.4.2 Umwandlung rekursiver in iterative Verfahren Beispiel: größter gemeinsamer Teiler rekursiv: algorithmus ggT(a,b: int)  int { wenn a=b dann rückgabe a; wenn b>a dann rückgabe ggT(b,a); rückgabe ggT(a-b,b) } Iterativ: { solange nicht a=b do {wenn b > a dann vertausche(a,b) sonst a := a-b}; rückgabe a }

Beispiel: Fakultät. algorithmus fak(n: int)  int { wenn n=0 dann rückgabe 1 sonst rückgabe n•fak(n-1) } Nicht endständig. Zuerst: Umwandlung in einen Algorithmus mit endständiger Rekursion: algorithmus fakt(n: int, akku: int)  int { wenn n=0 dann rückgabe akku sonst rückgabe fakt(n-1,n•akku) } (Aufruf mit akku=1).

Endständige Rekursion zur Berechnung der Fakultät: algorithmus fakt(n: int, akku: int)  int { wenn n=0 dann rückgabe akku sonst rückgabe fakt(n-1,n•akku) } Nun: ein iterativer Algorithmus: algorithmus faks(n: int)  int { akku: int; akku := 1; solange nicht n=0 führe_aus { akku := n•akku; n := n-1 }; rückgabe akku }

Ein anderer iterativer Algorithmus: algorithmus fakr(n: int)  int { akku : int; akku := 1; k : int; k := 0, solange k < n führe_aus { k := k+1; akku := k • akku }; rückgabe akku }

Primitive Rekursion: Ein allgemeines Schema der linearen Rekursion. Dient zur Definition einer Funktion  f: No  X  Y . Gegeben: a: X  Y  (Anfangswertfunktion), r: No  X  Y  Y (Rekursionsschema). Dann f definiert durch: (1)    f(n,x) = a(x),     falls n=0 (2)    f(n,x) = r(n, x, f(n-1,x)),     sonst

Beispiel: Mit X= No, Y= No, a(x)=1, r(n,x,y)=x•y erhält man die Potenzfunktion f(n,x) = xn. Beispiel: Mit X={()}, Y= No, a()=1, r(n,y)=n•y erhält man die Fakultätsfunktion. Beispiel: Was für eine Funktion erhält man mit X=Y= R+, a(x)=x/2, r(n,x,y)=1/2(y+(x/y)) ?

public class Iter { private static int String2Int(String s) { Integer I = new Integer(s); return I.intValue(); } private static double r(int n, double x, double y) { return 0.5*(y + x/y); } private static double a(double x) { return x/2; } private static double iter(int n, double x) { double akku = a(x); int k = 0; while ( k < n ) { System.out.println(k+": "+akku); akku = r(k+1,x,akku); k = k+1; } return akku; public static void main(String[] args) { int x = String2Int(args[0]); double y = iter(7,x); System.out.println("-------------------"); System.out.println("Ergebnis: "+y);

Iterativer Algorithmus für f, definiert durch primitive Rekursion aus a und r : algorithmus iter(n: int, x: xVal)  yVal { akku : yVal; akku := a(x); k : int; k := 0; solange k < n führe_aus { akku := r(k+1,x,akku); k := k+1 }; rückgabe akku }