TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Praktikum Grundlagen der Programmierung Aufgabenblatt 8 Robert Eigner, Florian Forster SS 2010 21.06.2010 Abgabe: Eine Woche nach Besprechung im Praktikum. Praktikum Grundlagen der Programmierung Aufgabe 39 (Ü) Palindrome Palindrome sind Worte (oder auch ganze Sätze), die von vorn oder hinten gelesen identisch bleiben, wie z. B. REGALLAGER. Implementieren Sie eine rekursive Java-Methode, die eine Zeichenkette daraufhin überprüft, ob sie ein Palindrom ist oder nicht. Testen Sie Ihre Methode mit unterschiedlichen Eingaben. Aufgabe 40 (Ü) Binäre Suchbäume Bein Binärbaum ist ein Baum, in dem alle Knoten nicht mehr als 2 Kinder haben. Ein binärer Suchbaum (BSB) ist ein Binärbaum, der folgende zusätzliche Ordnungseigenschaft erfüllt: für jeden Knoten des Baums gilt, dass sein eigener Wert nicht kleiner ist als die Werte aller Knoten in seinem linken Teilbaum, aber echt kleiner ist als die Werte aller Knoten in seinem rechten Teilbaum. Implementieren Sie eine Klasse, mit der man BSBs repräsentieren kann. Jeder Knoten nimmt ein Datum vom Typ int als Wert an. Implementieren Sie insbesondere die folgenden Methoden: a) add(int value): erzeugt einen neuen Knoten mit dem Wert value und fügt ihn an der richtigen Stelle im Baum ein b) min(): sucht den kleinsten Wert innerhalb eines Baumes und gibt ihn aus c) max(): sucht den größten Wert innerhalb eines Baumes und gibt ihn aus d) size(): gibt die Anzahl der Knoten eines Baumes aus e) depth(): gibt die maxmimale Tiefe eines Baumes, d. h. also die maximale Länge eines Pfades von der Wurzel bis zu einem Blatt aus Verwenden sie in allen Methoden Rekursion! Aufgabe 41 (Ü) Javadoc Zur Dokumentation des Quelltexts bietet Java eine spezielle Form von Kommentaren (Javadoc), die einer vorgegebenen Notation folgen. Aus den Kommentaren lassen sich mit Hilfsprogrammen (Doclets) übersichtliche Dokumentationen der eigenen Programme erzeugen. Lesen Sie sich in die Javadoc-Beschreibung von Oracle / SUN ein (http://java.sun.com/j2se/javadoc/ writingdoccomments/index.html) und beantworten Sie anschließend die folgenden Fragen: • Welche Elemente eines Java-Programms lassen sich mit Javadoc-Kommentaren ausstatten? • Wie ist ein Javadoc-Kommentar aufgebaut? • Welche Tags innerhalb eines Javadoc-Kommentars werden unterstützt? Welche davon sind zwingend erforderlich, welche optional? • Dokumentieren Sie Ihren Quelltext aus der vorhergehenden Aufgabe mit Javadoc. Erstellen Sie eine Javadoc-HTML-Dokumentation für Ihr Programm. –2– Aufgabe 42 (H) Fibonacci-Zahlen revisited (6 Punkte) Die Fibonacci-Zahlen dürften Sie schon kennen. Nur zur Erinnerung, sie sind definiert als: 0, falls n = 0 1, falls n = 1 f ib(n) := n ∈ N0 f ib(n − 1) + f ib(n − 2), sonst a) Implementieren Sie eine Java-Klasse, die drei unterschiedliche Methoden anbietet, die ihr jeweiliges Ergebnis auf der Konsole ausgeben: (i) eine Methode zur rekursiven Berechnung der Fibonaccizahlen (ii) eine Methode zur iterativen Berechnung der Fibonaccizahlen (iii) eine Methode zur expliziten Berechnung der Fibonaccizahlen, die die Moivre-BinetFormel verwendet: " √ !n √ !n # 1+ 5 1− 5 1 − f ib(n) = √ 2 2 5 Um mit größeren Zahlen (z. B. f ib(n) mit n > 50) rechnen zu können, ist Java wahrscheinlich nicht die geeignete Sprache. Verwenden Sie die java.math.BigInteger- und java.math.BigDecimal-Klassen, um die Java-Einschränkungen hinsichtlich Wertebereich und Genauigkeit von Zahlen zu umgehen. b) Versuchen Sie, f ib(50) zu berechnen und vergleichen Sie die Laufzeiten der verschiedenen Methoden. Verwenden Sie zur Zeitmessung die java.lang.System.nanoTime()Methode und geben sie die Laufzeit der drei unterschiedlichen Methodenaufrufe auf der Konsole aus. Aufgabe 43 (H) Binäre Suchbäume – weitere Funktionen (10 Punkte) Rufen Sie sich noch einmal den binären Suchbaum von Aufgabe 40 in Erinnerung. Implementieren Sie zusätzlich folgende Methoden: a) inorder(): diese Methode traversiert einen Baum, d. h. sie besucht jeden einzelnen Knoten und gibt seinen Wert aus. Die Reihenfolge ist wie folgt: zuerst werden alle Kindknoten des linken Teilbaumes besucht, dann der Wert des aktuellen Knoten ausgegeben, danach wir der rechte Teilbaum besucht. Hinweis für Fans: mit dieser Methode können Sie auf einen Blick sehen, ob Sie Ihren BSB auch korrekt aufgebaut haben. Woran sieht man das an der Ausgabe? b) preorder(): auch diese Methode traversiert einen Baum, nur in einer wieder anderen Reihenfolge: zuerst wird der Wert des aktuellen Knoten ausgegeben, dann werden alle Kindknoten des linken Teilbaumes besucht, dananch wird der rechte Teilbaum besucht. Der Algorithmus heißt auch depth-first traversal, da er zuerst tiefer in den Baum geht bevor die Geschwisterknoten besucht werden. c) postorder(): auch diese Methode traversiert einen Baum, nur in einer wieder anderen Reihenfolge: zuerst werden alle Kindknoten des linken Teilbaumes besucht, danach wird der rechte Teilbaum besucht und dann wird der Wert des aktuellen Knoten ausgegeben. d) levelorder(): auch diese Methode traversiert einen Baum, nur in einer anderen Reihenfolge: zuerst wird der Wurzelknoten besucht, dann alle seine unbesuchten Kindknoten. Erst wenn diese alle besucht wurden, werden wiederum alle Kindknoten der Kinder besucht. Der Algorithmus heißt auch breadth-first traversal, da er zuerst die Knoten eines „Stockwerks“, d. h. der Breite nach, besucht und dann erst in das nächste tiefergelegene Stockwerk herabsteigt. Verwenden sie in allen Methoden Rekursion! Grundsätzlich gilt: wenn ein Knoten besucht wird, dann soll sein Wert auf der Konsole ausgeeben werden.