Informatik II Übung 02 Benjamin Hepp [email protected] 8 March 2017 Nachbesprechung U1 08.03.2017 Informatik II - Übung 01 2 Nachbesprechung U1.1 f(a,b) = a x b = § a) Induktionsbeweis ueber a nicht moeglich § Fuer b > 0 wird f mit immer groesserem a aufgerufen. Daher ist eine Reduktion auf einen Induktionsanfang nicht moeglich § 08.03.2017 b) Fuer b > 0 muss b zwangslaeufig b = 1 erreichen. Somit terminiert der Algorithmus. Informatik II - Übung 02 3 Nachbesprechung U1.1 c) Terminierung bei b == 0 f(a,b) = a x b = Der Induktionsanfang erfolgt nun fuer b == 0 à f(a, 0) = 0. Der Induktionschrit bleibt aehnlich (bis auf b/2 \in {0, 1, ...} etc.) Die ganzzahl-Division 1 / 2 ergibt 0. Da wir gezeigt haben, dass b zwangslaeufig den Wert 1 erreicht, erreicht b auch zwangslaeufig den Wert 0. Damit terminert der Algorithmus weiterhin. 08.03.2017 Informatik II - Übung 02 4 Nachbesprechung U1.2 a) public static boolean gerade( int x ){ if( x == 0 ) return true; return !gerade( x-1 ); } public static int verdopple( int x ){ if( x == 0 ) return 0; return 2 + verdopple( x-1 ); } public static int halbiere( int x ){ if( x == 0 ) return 0; if( x == 1 ) return 0; return halbiere( x-2 ) + 1; } 08.03.2017 Informatik II - Übung 02 ➡ x ➡ x ➡ ⌊x/2⌋ 5 Nachbesprechung U1.2 b) Aufrufe der drei Methoden in Abhaengigkeit von a und b Falls b != 0 werden alle drei Methoden einmal aufgerufen: 3 + b + a + [b/2] ~= 3 + a + 3 b/2Typeequationhere. 08.03.2017 Informatik II - Übung 02 6 Nachbesprechung U1.2 c) Gesamtzahl Methodenaufrufe 𝑁(𝑎, 𝑏) ~= 3 + 𝑎 + = = = ; < + 𝑁(2𝑎, ) :; ; + 𝑁(4𝑎, ) > > :; :; ; 3 + 3 + 2@ 𝑎 + 2A 𝑎 + B + C + 𝑁(4𝑎, ) < < > :; 3 + 3 + 3 + ⋯ + 2@ 𝑎 + 2A 𝑎 + 2< 𝑎 + ⋯ + ( B < :; H G ∑HIA GJ@ 2 𝑎 + ∑GJA <K + 3𝑘 = 3+𝑎+ :; < :; < + 3 + 2𝑎 + + :; <C + :; <E + ⋯) Rekursionsende wenn b == 0. Dies ist der Fall nach ⌊𝑙𝑜𝑔< 𝑏⌋ + 1 Aufrufen. 08.03.2017 Informatik II - Übung 02 7 Nachbesprechung U1.2 c) Geometrische Reihe fuer 𝑞 < 1 V S 𝑎𝑞H 𝑁(𝑎, 𝑏) ~= 3 + 𝑎 + = = = ; < + 𝑁(2𝑎, ) :; ; + 𝑁(4𝑎, ) > > :; :; ; 3 + 3 + 2@ 𝑎 + 2A 𝑎 + B + C + 𝑁(4𝑎, ) < < > :; 3 + 3 + 3 + ⋯ + 2@ 𝑎 + 2A 𝑎 + 2< 𝑎 + ⋯ + ( B < :; H G ∑HIA GJ@ 2 𝑎 + ∑GJA <K + 3𝑘 = 3+𝑎+ :; < :; < HJ@ 𝑎 = 1−𝑞 + 3 + 2𝑎 + + :; <C + :; <E + ⋯) Rekursionsende wenn b == 0. Dies ist der Fall nach ⌊𝑙𝑜𝑔< 𝑏⌋ + 1 Aufrufen. 08.03.2017 Informatik II - Übung 02 8 Nachbesprechung U1.3 /** * 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 */ 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); } 08.03.2017 Informatik II - Übung 02 9 Nachbesprechung U1.3 Aufruf einer Funktion die eine Exception wirft public static int function(int a, int b) { try { int prod = mult(a, b); } catch (IllegalArgumentException e) { // Handle exception } } 08.03.2017 Informatik II - Übung 02 10 Hinweise zu U2 8 March 2017 Informatik II - Übung 01 11 Hinweise U2 08.03.2017 § 1. Wurzelbäume § 2. Rekursives Sortieren § 3. Binärbäume als Arrays Informatik II - Übung 02 12 Hinweise U2.1 § Baum: Kreisfreier Graph § Wurzelbaum: Ein gerichteter, kreisfreier Graph, so dass jeder Knoten von der Wurzel aus erreichbar ist § Verschiedene Darstellungen moeglich § Was ist die Hoehe eines Baumes? § Was ist ein Pfad? A B C 08.03.2017 Informatik II - Übung 02 E D 13 Hinweise U2.2 § Array im Konstruktor initialisieren! numbers = new int[length]; § Zufallszahlen im Konstruktor erzeugen: import java.util.Random; ... Random r = new Random(); int n = r.nextInt(maxValue); 08.03.2017 Informatik II - Übung 02 14 Hinweise U2.2 § Sortieren mittels Rekursion § Annahme: Array enthaelt bereits die until - 1 groessten Elemente in den until - 1 ersten Stellen § Wir suchen das groesste Element im uebrigen Array und tauschen, falls groesser, mit dem Element an der Stelle until - 1 § -> Array enthaelt nun die until groessten Elemente in den until ersten Stellen § Wenn until == length dann ist das Array absteigend sortiert § Beispiel: 8 3 4 2 9 08.03.2017 Informatik II - Übung 02 15 Hinweise U2.3 A B D 08.03.2017 C F E § int father(int node) { ... } § int leftChild(int node) { ... } § int rightChild(int node) { ... } Informatik II - Übung 02 16 Hinweise U2.2 § Sortieren mittels Rekursion void recursiveSort(int until) { ... } § Rekursionsabbruch: until == 0 § Sonst rekursiver Aufruf mit until - 1 § Achtung: Wenn until == numbers.length nach dem rekursiven Aufruf fertig. § Ansonsten Tausch des Elements bei until - 1 mit dem groessten Element im uebrigen Array § Schreibt eine extra Methode fuer das Tauschen eines Elements void swap(int i, int j) { ... } 08.03.2017 Informatik II - Übung 02 17 Hinweise U2.3 § Ein Wurzelbaum bei dem jeder Knoten zwei „Nachfahren“ hat § Der Nachfahre eines Knotens kann auch der „leere Knoten“ sein § Darstellung als Array sinnvoll wenn maximale Tiefe bekannt ist und schneller Zugriff erwuenscht § Die Ebenen des Baumes werden nacheinander im Array angeordnet 08.03.2017 Informatik II - Übung 02 18 Hinweise U2.3 § toString() rekursiv implementieren § Also String toString(int node, String indentation) { ... } § Erster Aufruf: public String toString() { return toString(0, ““); } § Achtung, Sonderfaelle beachten: Leerer Baum § checkTree() § Prueft fuer jeden Knoten der kein leerer Knoten ist, ob sein „Vater“ existiert. § Ignoriert leere Knoten 08.03.2017 Informatik II - Übung 02 19