Institut fur Informatik der Universitat Munchen Dr. Jan Johannsen Jan Homann WS 2007/08 4. Dezember 2007 Ubungen zum Repetitorium Informatik 1 Blatt 7 Aufgabe H-16 (4 Punkte): Stellen Sie sie vor, Sie arbeiten bei einem deutschen Tele- komunikationunternehmen, dessen Software in SML implementiert ist. Aufgrund der gesetzlichen Neuregelung der Telekommunikationsuberwachung mussen Sie die Anruisten Ihrer Kunden speichern. Dies soll soll so geschehen, dass entweder direkt die angerufene Nummer gespeichert wird oder der Nachname, des Angerufenen Teilnehmers, falls dieser in Ihrer Datenbank vorhanden ist. Denieren Sie also einen SML-Typ mit dem Sie Listen darstellen konnen, die sowohl Werte vom Typ int list (Telefonnummern) als auch vom Typ string (Namen) enthalten konnen. Aufgabe H-17 (6 Punkte): In der Datei 7-1.sml nden Sie die folgende Denition eines SML-Typs fur knotenbeschriftete Binarbaume. datatype ’a bintree = Empty | Node of ’a * ’a bintree * ’a bintree; In dieser Aufgabe sollen Sie Funktionen denieren, die die Beschriftungen der Knoten eines Binarbaums in verschiedenen Reihenfolgen ausgeben. (a) Schreiben Sie eine Funktion preorder: ’a bintree -> ’a list, die die Knotenbeschriftungen in ausgibt. Das heit fur jeden Teilbaum T wird erst die Beschriftung der Wurzel ausgegeben, dann die Beschriftungen im linken Teilbaum von T , dann die Beschriftungen im rechten Teilbaum von T . pre-order (b) Schreiben Sie eine Funktion inorder: ’a bintree -> ’a list, die die Knotenbeschriftungen in ausgibt. Das heit fur jeden Teilbaum T werden erst die Beschriftungen im linken Teilbaum von T ausgegeben, dann die Beschriftung der Wurzel und dann die Beschriftungen im rechten Teilbaum von T . in-order (c) Schreiben Sie eine Funktion postorder: ’a bintree -> ’a list, die die Knotenbeschriftungen in ausgibt. Das heit fur jeden Teilbaum T werden erst die Beschriftungen im linken Teilbaum von T ausgegeben, dann die Beschriftungen im rechten Teilbaum von T und dann die Beschriftung der Wurzel von T . post-order Geben Sie Ihre Losung als Textdatei mit dem Namen h-17.sml ab. Aufgabe H-18 (4 Punkte): Verwenden Sie wieder den Datentyp bintree aus der vorherigen Aufgabe. Hohe (a) Die eine Binarbaums ist das grote n, fur das Knoten k1 , . . . , kn existieren, so dass fur i = 1, . . . , n − 1 ki+1 ein Kind von ki ist. Implementieren Sie eine Funktion height: ’a bintree -> int, die die Hohe eines Binarbaums berechnet. (b) Schreiben Sie eine Funktion maptree: (’a -> ’b) -> ’a bintree -> ’b bintree, so dass der Aufruf maptree f t einen Baum liefert, der aus t entsteht, indem man alle Beschriftungen a durch den Wert f(a) ersetzt. Geben Sie Ihre Losung als Textdatei mit dem Namen h-18.sml ab. Aufgabe P-16: Sie T ein Binarbaum. Der Level lev(k) eines Knoten k aus T kann wie folgt rekursiv deniert werden. Falls k die Wurzel von T ist, so ist lev(k) = 0. Falls k ein Kind des Knotens p ist, so ist lev(k) = lev(p) + 1. (a) Schreiben Sie eine SML-Funktion level: ’a bintree -> ’a list list, die eine Liste [l0 , . . . , ln ] ausgibt, so dass li die Liste der Knoten k mit lev(k) = i ist. (b) Implementieren Sie eine SML-Funktion createtree: ’a list -> ’a bintree, die einen Binarbau aus einer Liste erzeugt, so dass die Level des Baums sukzessive mit Elementen aus der Liste gefullt werden. Das heit, dass aus einer Liste [a0 , . . . , an ] ein Baum entstehen soll, in dem die Wurzel mit a0 beschriftet ist, die Knoten auf Level 1 mit a1 und a2 , die auf Level 2 mit a3 , a4 , a5 , a6 , usw... Aufgabe P-17: Die Funktionen foldr: (’a * ’b -> ’b) -> ’b -> ’a list -> ’b, foldl: (’a * ’b -> ’b) -> ’b -> ’a list -> ’b und rev: ’a list -> ’a list konnen in SML wie folgt implementiert werden. fun rev [] = [] | rev (x::xs) = (rev xs)@[x]; fun foldr f s [] = s | foldr f s (x::xs) = f (x,foldr f s xs); fun foldl f s [] = s | foldl f s (x::xs) = foldl f (f (x,s)) xs; Beweisen Sie das fur alle f s und l: foldl f s l = foldr f s (rev l). Abgabe der Hausaufgaben u ber UniWorx bis spatestens Dienstag, 11.12.2007, 14 Uhr. Besprechung am Dienstag, 11.12.2007.