Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Slides:



Advertisements
Ähnliche Präsentationen
Klassen - Verkettete Liste -
Advertisements

Kapitel 6. Suchverfahren
Synonyme: Stapel, Keller, LIFO-Liste usw.
Rekursion Was ist Rekursion? Was sind rekursive Methoden?
Imperative Programmierung
der Universität Oldenburg
Sortieren mit Binären Bäumen
Java: Dynamische Datentypen
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 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
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Rekursion Richard Göbel.
Einfach verkettete Listen (OOP)
Rekursion mit Listen: Quicksort
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
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 Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Efficient Alias Set Analysis Using SSA Form Proseminar Programmanalyse WS 11/12 André Hunke.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
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.
Einführung in die Programmiersprache C 4
Informatik 1 Letzte Übung.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Algorithmen und Datenstrukturen Übungsmodul 6
Algorithmen und Datenstrukturen SS 2005
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 5 Dr. W. Narzt u. Dr. A. Stritzinger.
2.4 Rekursion Klassifikation und Beispiele
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Algorithmen und Datenstrukturen Übungsmodul 8
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Algorithmen und Datenstrukturen SS 2005
Algorithmen und Datenstrukturen Übungsmodul 1
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 2 Dr. W. Narzt u. Dr. A. Stritzinger.
SWE1 / Übung 10 ( ) Rekursion Binärbäume.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Algorithmen und Datenstrukturen 1 SS 2002
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen 1 SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
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 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Programmiersprachen II Fortsetzung Datenstrukturen Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Vorbesprechung Klausur Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Pointer, Arrays und verkettete Listen. Mehrdimensionale Arrays  Pointer auf ein Array von Pointern  int32 **matrix = new int32*[3];  matrix: Zeiger.
Raphael Fischer Informatik II - Übung 05 Raphael Fischer
Einführung in die Programmierung
1. Die rekursive Datenstruktur Liste 1.3 Rekursive Funktionen
 Präsentation transkript:

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas Hilpold Institut für Wirtschaftsinformatik Software Engineering JKU Linz Termin 7 – Rekursion

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 2 Lösung Übung 5 Themenbereiche heute Rekursion Rekursion mit rek. Datentypen Übungsbesprechung Übung 7 Übersicht

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 3 Lösung Ü5 Algorithmen xyz, nach: foo1, foo2 Tafel

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 4 Rückblick letztes Mal rekursive Datentypen refType obligat enthält Referenzvariable vom eigenen Typ einfach verkettete Listen Iterative Algorithmen zum Einfügen, Sortieren, Suchen

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 5 Rekursive Algorithmen Allgemeines Ein rekursiver Algorithmus ruft sich selbst auf. zB. a() {.... a().... } Viele Probleme lassen sich mit Rekursion eleganter als iterativ definieren und lösen.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 6 Rekursive Algorithmen Beispiel Fakultät Fakultät = Produkt aller natürlichen Zahlen von 1..n Iterative Definition n! = 1*2*3*...*(n-1)*n Rekursive Definition (Mathematik) n! = für n = 1  1 n! = für n > 1  (n-1)!*n Rekursive Definition (Informatik) int faculty (  n) { if (n==1) { return 1 } return faculty(n-1)*n

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 7 Rekursive Algorithmen Beispiel Fakultät (2) int faculty (  n) { if (n==1) { return 1 } return faculty(n-1)*n } int x = faculty(3) return 1 faculty(1) * 2 faculty(2) * 3 faculty(3) Technisch ist dies aufgrund des Aufrufstacks möglich, der hier jedesmal n bewahrt. Jede Rekursionsstufe hat ihr eigenes n.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 8 Rekursive Algorithmen Allgemeines Typisches Schema: if (Problem klein genug) -> nichtrekursiver Zweig else -> rekursiver Zweig Immer nötig: nichtrekursiver Zweig! (sonst Endlosrekursion) indirekte Rekursion: a ruft b, b ruft a. (Mehrere Algorithmen) Jedes rekursive Problem läßt sich auch iterativ lösen. Iterative Lösungen sind oft schneller. Dafür aber länger und schwerer zu verstehen. (rek. Datentypen)

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 9 Rekursive Algorithmen Beispiel Fakultät (3) //iterativ int faculty (  n) { int result = 1; for (int i = 2; i <= n; i++) { result = result * i; } return result; } //rekursiv int faculty (  n) { if (n==1) { return 1 } return faculty(n-1)*n }

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 10 Beispiel: Palindrom Begriff Wort, das von vorne und hinten gelesen gleich lautet "MADAM", "OTTO" Aufgabe rekursiver Algorithmus, der für eine gegebene Zeichenkette feststellt, ob es sich um ein Palindrom handelt.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 11 Beispiel: Palindrom rekursive Definition palindrom() = true, für die leere Zeichenkette palindrom(a) = true, für Zeichenkette bestehend aus nur einem Zeichen palindrom(ax....xb) = true, wenn a==b && palindrom(x...x) Funktion: boolean palindromRec(  char[] s,  int i) //i..pos der zu vergl. chars Beispiele: "", "1", "121"

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 12 Beispiel: Palindrom rekursive Funktion Beispiele: "", "1", "121" boolean palindromRec(  char[] s,  int i) { //s[]=0..n-1; i=1..n if ( i > (strLen(s) / 2) ) { // Spieglungsachse ü berschritten ? return true } else { return ((s[i-1] == s[strLen(s)-i]) && palindromRec(s,i+1)) } // Aufrufer erwartet Funktion: boolean isPalindrom(char[] s) { return palindromRec(s, 1) }

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 13 Rek. Algorithmen auf Listen Allgemeines Algorithmen für rekursive Datentypen lassen sich oftmals besonders elegant mit rekursiven Algorithmen lösen. type List = { refType Node = { int value Node next } value = 1 next value = 2 next value = 3 next first Rekursive Definition der Datenstruktur List = Null List = Node | List

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 14 Rek. Algorithmen auf Listen Einfügen in sortierte Liste Rekursive Definition der Funktion insert(L,N) mit L = aufsteigend sortierte Liste N = Knoten, Knoten soll in L eingefügt werden und v(E) = Wert des Knotens E F | L = F ist der erste Knoten der Liste L definiert die Funktion insertRec (L,N) wie folgt: insertRec (L,N) = für L==Null  N insertRec (F|L,N) = für w(F)  w(N)  N | F | L insertRec (F|L,N) = für w(F)  w(N)  F | insertRec (L,N)

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 15 Rek. Algorithmen auf Listen Einfügen in sortierte Liste void insert(int value) { Node n = new Node n^.value = value n^.next = null first = insertRec(list, n) // first part of List } Node insertRec(Node l, Node n) { if (l == null) { // end of list or empty list return n } else if (l^.value >= n^.value) { // insert here N | L n^.next= l; return n } else { l^.next = insertRec(l^.next,n) // try return L } value = 1 next value = 2 next value = 3 next first

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 16 Rek. Algorithmen auf Listen Einfügen in sortierte Liste (Vereinfacht) void insert(int value) { Node n = new Node n^.value = value first = insertRec(list, n) // first part of List } Knoten insertRec(Node l, Node n) { if (l == null || l^.value >= n^.value) { n^.next= l; return n } else { l^.next = insertRec(l^.next, n) return L } value = 1 next value = 2 next value = 3 next first

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 17 iterative Lösung insertSorted(  int a) { Node newElem, cur, prev newElem = new Node newElem^.value = a //position suchen cur = first; prev = null while(cur != null && cur^.value < newElem.value) { prev = cur cur = cur^.next } if (prev != null) { // Mitte oder Ende prev^.next = newElem } else { first = newElem } newElem^.next = cur } // end insertSorted

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 18 Zusammenfassung Rekursiver Algorithmus = Algorithmus, der sich selbst aufruft (auch indirekt) Rekursive Algorithmen haben immer mind. einen rekursiven Zweig und mind. einen nicht-rekursiven Zweig (Ohne nicht-rek. Zweig -> Endlosrekursion) Zu jeder rekursiven Lösung läßt sich eine iterative Lösung finden. Rekursive Lösungen sind häufig kürzer und eleganter, aber meist ineffizienter als iterative Lösungen. Technisch werden von Rekursionsschritt zu Rekursionsschritt alle lokalen und aktuellen Parameter des Aufrufers auf einem Stack bewahrt und stehen nach Rückkehr zur Verfügung. (vgl. normaler Prozeduraufruf) Für Rek. Datentypen lassen sich meist elegante rek. Algorithmen finden.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 19 Übung 7 ad 1) Spiegelung einer Zeichenkette char[] mirror(char[] str) // "123" -> "321" ad 2) Rekursive Algorithmen auf Listen absteigend sortierte Liste insert (  int a){...} //Sortiertes Einfügen des Wertes a boolean search(  int a) int searchMultiple(  int a){..} delete(  int a){...} deleteAll(  int a){...}