fakultät für informatik - Technische Universität München

Werbung
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.
Herunterladen