Informatik II – Übung 2 Gruppe 3 Leyna Sadamori [email protected] Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 1 Debriefing Übung 1 Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 2 Lösung U1.A1 f(a,b) = a ∙ b = a) Induktionsbeweis über a möglich? Induktion über a ist nicht möglich. Der Induktionsanfang schlägt bereits für b > 1 fehl! a ist eine stetig wachsende Grösse à kein Rückschluss auf bereits bewiesene Fälle möglich und keine Induktionsannahme formulierbar. b) Terminiert der Algorithmus? Ja, wenn man b auf 1 zurückführen kann Ist das der Fall? Ja! Weil b immer halbiert wird gilt: Nach ⎣log2(b)⎦ Schritten wird b = 1 sein! Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 3 Lösung U1.A1 c) Wie ändert sich der Beweis, wenn der kleinste Fall b = 0 ist? Die Definition der Funktion sieht wie folgt aus: f(a,b) = a ∙ b = Die Induktionsannahme lautet dann: Der Induktionsschritt ist ähnlich wie im Original, da Die Ganzzahldivision von 1 durch 2 ergibt 0. In 1b) haben wir gezeigt, dass es immer zu b = 1 kommt, also kommt es auch immer zu b = 0. Wir müssen den Beweis also im wesentlichen nicht ändern. Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 4 Lösung U1.A2a Anzahl rekursive Aufrufe (+1, wenn man den ursprünglichen Aufruf mitzählt): static boolean gerade(int x) { if (x == 0) return true; return !gerade(x-1); } x (oder x+1) static int verdopple(int x) { if ( x == 0 ) return 0; return 2 + verdopple(x-1); } x (oder x+1) static int halbiere(int x) { if (x == 0) return 0; if (x == 1) return 0; return 1 + halbiere(x-2); } ⎣x/2⎦ (oder ⎣x/2⎦+1) Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 5 Lösung U1.A2b Aufrufe der drei Methoden insgesamt in Abhängigkeit von a und b bei einem Aufruf von f. static int f(int a, int b) { if (b == 0) return 0; if (gerade(b)) return f(verdopple(a), halbiere(b)); return a + f(verdopple(a), halbiere(b)); } In jedem Fall wird gerade(b), verdopple(a) und halbiere(b) aufgerufen. Der Anzahl der Aufrufe (mit Ergebnissen aus Teil 2a) ist also höchstens: b+1 + a+1 + ⎣b/2⎦+1 ≈ a + 3b/2 + 3 Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 6 Lösung U1.A2c Gesamtanzahl der Methodenaufrufe: Es ist nicht (# Aufrufe von f) * (# Aufrufe von Teil 2b)! Mit dem Ergebnis aus 2b) ergibt sich: 1. Aufruf + 2. Aufruf + … … insgesamt k Aufrufe Die Rekursion endet, wenn b = 0 ist. Das ist der Fall nach k = ⎣log2 b⎦ + 1 Aufrufen, da b in jedem Schritt halbiert wird. Dies ergibt ≈ 2ab - a + 3b (s. Rechenweg in Übungsstunde). Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 7 Lösung U1.A3 public class Mult { private static int f(int a, int b) { if (b == 1) return a; if (b%2 == 0) return f(2*a, b/2); else return a + f(2*a, b/2); } /** * This function implements the ancient Egyptian multiplication. * * @param a must be a positive integer * @param b must be a positive integer * @return the product of a and b * @throws IllegalArgumentException if a or b is not positive */ public static int mult(int a, int b) throws IllegalArgumentException { if (a < 1) throw new IllegalArgumentException("Parameter a must be a positive integer but is " + a); if (b < 1) throw new IllegalArgumentException("Parameter b must be a positive integer but is " + b); return f(a, b); } } Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 8 Theorie, Praxis, Tipps Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 9 Debugging in Eclipse § Breakpoints setzen § Step over, Step into, Resume § Values, Expressions § Conditional Breakpoints Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 10 Briefing Übung 2 Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 11 Hinweise U2.A1 Darstellung § Aufgabe: § Umgang mit verschiedenen Darstellungen § Klammerdarstellung, eingerückte Form, Graphen § Begriffe: § Wurzel, Knoten, Kanten, Blätter, (leere) Teilbäume... A B C Informatik II – Übung 2 E D Leyna Sadamori | 8. März 2017 | 12 Hinweise U2.A2 Sortieren § § Beachtet die Kommentare im bereitgestellten Sourcecode! Verwendung von java.util.Random: Java API konsultieren § (http://docs.oracle.com/javase/8/docs/api/) // RandomGenerator erzeugen: Random rg = new Random(); // Array erzeugen … // random number generieren rg.nextInt(1000); § toString() (Format ist im Javadoc beschrieben) String s = ""; for ( int i = 0; i < array.length; i++ ) { ... } return s; Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 13 Hinweise U2.A2 Sortieren § Grundidee der Rekursion: § Reduzieren einer Probleminstanz auf eine kleinere Probleminstanz § Gegeben: Liste mit n Elementen Um eine Teilliste mit i Elementen absteigend zu sortieren, brauche ich nur... ... die ersten (i – 1) Elemente absteigend sortieren ... das grösste Element im Rest der Liste suchen ... und an die erste Stelle des Restes der Liste setzen § Die leere Liste ist selbstverständlich schon sortiert... Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 14 [ [ [ [ [ [ [ [ [ [ [ [ [ 5 5 5 5 5 5 5 9 9 9 9 9 9 1 1 1 1 1 1 1 1 1 5 5 5 5 9 9 9 9 9 9 9 5 5 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 ] ] ] ] ] ] ] ] ] ] ] ] ] recursiveSort(0,3) recursiveSort(0,2) recursiveSort(0,1) recursiveSort(0,0) recursiveSort(0,-1) Ist sortiert! findLargest(0,3) -> 9 Swap(0,2) findLargest(1,3) -> 5 Swap(1,2) findLargest(2,3) -> 2 Swap(2,3) Kein swap mehr nötig... à Liste absteigend sortiert! Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 15 Hinweise U2.A3 Binärbaum als Array § Binärbäume kann man leicht in einem Array speichern, wenn dieses geeignet interpretiert wird. char[] tree = new char[7]; A B D tree[0] = ’A’; tree[1] = ’B’; tree[2] = ’C’; tree[3] = ’D’; tree[4] = ’ ’; tree[5] = ’F’; tree[6] = ’E’; C F E Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 16 Hinweise U2.A3 § Wichtige Überlegungen § Jeder Knoten erhält einen eindeutigen Index i im Array § Die Wurzel hat den Index 0 § Wie berechnet man die Indizes der Kindknoten eines Knotens mit Index i? § Wie berechnet man den Index des Vaterknotens eines Knotens mit Index i? § Wie berechnet man die Ebene für einen Knoten mit Index i? Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 17 Hinweise U2.A3 § Überprüfung auf Korrektheit § Jeder gültige Knoten muss einen Vaterknoten haben (ausser Wurzel) § Wie werden “leere” Knoten behandelt? § toString() Implementierung § Rekursive Implementierung (Ausgabe von Teilbäumen) § Idee: Gebe aktuellen Knoten aus, danach linken und rechten Teilbaum. Abbruchkriterium? § Anzahl Einrückungen berechnen (s. vorherige Überlegungen) Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 18 …viel Spass! Informatik II – Übung 2 Leyna Sadamori | 8. März 2017 | 19