Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas."—  Präsentation transkript:

1 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

2 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

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

4 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

5 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.

6 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

7 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.

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

9 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 }

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

11 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"

12 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) }

13 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

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

15 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

16 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

17 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

18 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.

19 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){...}


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

Ähnliche Präsentationen


Google-Anzeigen