Rekursion Richard Göbel
Hilfestellung zur Konstruktion neuer Algorithmen Idee: Rekursion Hilfestellung zur Konstruktion neuer Algorithmen Idee: Aufgabe zerlegen Kleinere Aufgaben lösen Gesamtlösung aus Teillösungen zusammensetzen Rekursive Algorithmen sind teuer: Speicherplatzverbrauch Laufzeit
Welche Verfahren müssen entwickelt werden? Verfahren zur Zerlegung einer Aufgabestellung A in kleinere Aufgabenstellungen B1, B2, . . ., Bn Verfahren zur Konstruktion der Gesamtlösung für A aus den Lösungen für B1, B2, . . ., Bn Verfahren zur Lösung einer „kleinen“ Aufgabenstellung, die nicht weiter zerlegt werden kann
Aufbau eines rekursiven Algorithmus F F(A) A zerlegbar A nicht zerlegbar Zerlegen: A B1, B2, . . . Bn Löse A direkt Rekursion: F(B1) F(B2) . . . F(Bn) Konstruieren: F(B1) F(B2) . . . F(Bn)F(A)
Beispiel 1 – Summe der Zahlen von 1 bis n Funktion sum : int int Ansatz Zerlegen: n n-1 Nicht zerlegbar: n = 1 Verfahren sum(1) = 1 sum(n) = sum(n-1) + n für n > 1
Programmcode . . . static int sum(int n) { if (n == 1) return 1; } else return n + sum(n-1);
Funktionsaufrufe benötigen relativ viel Zeit! Kosten Jeder Funktionsaufruf benötigt mindestens den folgenden Speicherplatz auf dem Stack: Rücksprungadresse Aufrufparameter Der Speicherplatzaufwand steigt linear mit dem Betrag des übergebenen Parameters! Funktionsaufrufe benötigen relativ viel Zeit!
Weitere Aufgabe Fakultät: n! Inhalt eines Array umdrehen Sortieren der Zahlen in einem Array
Rekursion für Baumstrukturen Rekursive Algorithmen sind ideal für Baumstrukturen Beginne mit dem Wurzelknoten Wende das Verfahren rekursiv auf alle Kinderknoten an Beispiele Zähle die Knoten in einem Baum Ausgabe der Knoten eines Baums in einer vorgegebenen Ordnung (PreOrder, InOrder, PostOrder) Finde einen Knoten in einem Baum
Aufwand analysieren g f n0 Die O-Notation gibt eine qualitative Abschätzung für den Verlauf einer Funktion (hier Zeit- oder Speicheraufwand) Für eine Funktion f wird der qualitative Aufwand mit einer einfacheren Funktion g angegeben: c, n0 : n : n n0 | f(n) | | c g(n) | f g n0