Einführung in die Informatik Wintersemester 03/04 Albert-Ludwigs-Universität Freiburg Institut für Informatik Prof. Dr. W. Burgard Dipl.-Inf. M. Bennewitz & M. Veeck Übungsaufgaben Aufgabe 1 Gegeben sei folgende Funktion f : N → N von den natürlichen Zahlen in die natürlichen Zahlen: falls n = 1 1 f (n/2) falls n gerade f (n) = f (3 · n + 1) sonst (a) Schreiben Sie eine rekursive Java-Methode, die diese Funktion implementiert. (b) Berechnen Sie f (5). Geben Sie dabei alle Zwischenschritte an. Aufgabe 2 Betrachten Sie folgende Java-Methode static int G(int n){ int x; if (n==1) x = 1; else { x = n*n-1; x += G(n-1); } return x; } Zeichnen Sie die Activation Records für den Aufruf G(4) zu dem Zeitpunkt, an dem maximale Rekursionstiefe erreicht ist. Aufgabe 3 1. Die folgende Methode berechnet die Transponierte einer quadratischen Matrix. Führen Sie eine Aufwandsabschätzung für die Laufzeit in Abhängigkeit von der Dimension n der Matrix qmatrix durch. static QMatrix transpose(QMatrix qmatrix) { int n = qmatrix.n; QMatrix result = new QMatrix(n); for (int i = 0; i < n; i++) { result.value[i][i] = qmatrix.value[i][i]; for (int j = 0; j < i; j++) { result.value[j][i] = qmatrix.value[i][j]; result.value[i][j] = qmatrix.value[j][i]; } } return result; } 2. Das folgende Programmstück gibt alle durch ein Leerzeichen getrennten Worte eines Strings aus. Führen Sie eine Aufwandsabschätzung für die Laufzeit in Abhängigkeit von der Länge n des Strings str durch. int i = 0; int j = 0; int n = str.length(); while (i < n) { j = i; while ((j < n) && !(str.substring(j, j+1).equals(" "))) { j++; } System.out.println(str.substring(i,j)); i = j+1; } 2 Aufgabe 4 Betrachten Sie diese Klassenhierarchie. Geben Sie an, was in der main-Methode ausgegeben wird. abstract class Lebewesen { ... abstract void print(); } class Wassertier extends Lebewesen { ... void print() { System.out.println("Ich bin ein Wassertier."); } } class Landtier extends Lebewesen { ... void print() { System.out.println("Ich bin ein Landtier."); } } class Mensch extends Landtier { ... void print() { super.print(); System.out.println("Ich bin ein Mensch."); } } class Pferd extends Landtier { Pferd() { } } class Testklasse { public static void main(String[] arg){ Landtier wesen1 = new Landtier(); wesen1.print(); Wassertier wesen2 = new Wassertier(); wesen2.print(); Landtier wesen3 = new Mensch(); wesen3.print(); Landtier wesen4 = new Pferd(); wesen4.print(); Lebewesen wesen5 = new Mensch(); wesen5.print(); } } 3 Aufgabe 5 Betrachten Sie folgenden Programm-Code: ... int x = -13; int y = -120; int z = 42; while (x!=0 && y!=0) { x++; y += 4*x + z; } System.out.println(x*y); ... // Zeile 123 Was wird nach Beendigung der while-Schleife ausgegeben, wenn Zeile 123 erreicht wird? Begründen Sie Ihre Aussage. Aufgabe 6 Gegeben sei folgendes Skelett der Klasse BinaryTreeNode: public class BinaryTreeNode { ... public Object content; public BinaryTreeNode left; public BinaryTreeNode right; } 1. Betrachten Sie die folgenden zwei Abbildungen und schreiben Sie die Java-Anweisungen, welche die Situation, die in der linken Abbildung dargestellt ist, in die Situation der rechten Abbildung überführen. p,q,r sind hierbei Referenzvariablen, die Sie benutzen können. Benutzen Sie keine anderen Methoden! 2. Was passiert mit dem Objekt, das in der rechten Abbildung durch q referenziert wird, wenn die Anweisung q = null; ausgeführt wird? Beachten Sie, dass es zwei Möglichkeiten gibt. 4 p content left p O1 left right content right null null r r null null content q q O2 null content null O2 null null ... ... ... ... Aufgabe 7 1. Schreiben Sie eine Haskell-Funktion, die eine Liste von Integer-Zahlen als Argument nimmt und als Output die Liste der darin enthaltenen geraden Zahlen liefert. Verwenden Sie dabei nicht die filter-Funktion 2. Schreiben Sie eine Haskell-Funktion, die das maximale Element in einer Liste von Integer-Zahlen berechnet. Aufgabe 8 Betrachten Sie folgende Haskell-Funktionen: merge l [] = l merge [] l = l merge (x:xs) (y:ys) | x<y = x:merge xs (y:ys) | otherwise = y:merge (x:xs) ys square x = x * x squareevens = map square [0,2..] squareodds = map square [1,3..] 1. Zu welchem Wert wird der folgende Ausdruck in Haskell ausgewertet, wenn dabei die Strategie Lazy Evaluation angewandt wird? someExpression = take 5 (merge squareodds [2, 4, 7, 17, 19]) 2. Was passiert, wenn man den folgenden Ausdruck mit Eager Evaluation (call-byvalue) auswertet: someExpression2 = take 5 (merge squareodds squareevens) 5