Dr. David Sabel Institut für Informatik Fachbereich Informatik und Mathematik/ Institut für Informatik Johann Wolfgang Goethe-Universität Frankfurt am Main Einführung in die funktionale Programmierung Wintersemester 2010/2011 Aufgabenblatt Nr. 4 Abgabe: Montag 13. Dezember 2010 vor der Vorlesung Bitte senden Sie Ihren Quellcode auch per Email an [email protected] Aufgabe 1 (25 Punkte) Implementieren Sie in Haskell List Comprehensions, welche die folgenden Listen erzeugen. Die Verwendung von map, filter, concat und sonstigen rekursiven Funktionen auf Listen ist für die Lösung der Aufgabe nicht erlaubt. • Die Liste aller natürlichen Zahlen, die durch 3, aber nicht durch 5 teilbar sind.(5 Punkte) • Eine List Comprehension, die jede vierfach-geschachtelte Liste xs zu einer flachen Liste macht. Z.B. soll für xs = [[[[1],[2,3]],[[4],[5]]],[[[6,7],[8]],[[9],[10]]]] die Liste [1,2,3,4,5,6,7,8,9,10] erzeugt werden. (5 Punkte) • Eine Liste von Listen, wobei die i. Unterliste enthält das kartesische Produkt der Zahlen im Bereich {1, . . . , i} enthält. Die Liste beginnt daher wie folgt: [ [(1,1)], [(1,1),(1,2),(2,1),(2,2)], [(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)], ... (7 Punkte) • Die Liste aller 3-Tupel (a, b, c) von natürlichen Zahlen, die den Satz des Pythagoras erfüllen, d.h. für die gilt a2 + b2 = c2 . Die 3-Tupel sollten dabei fair generiert werden, d.h. jedes 3-Tupel (a, b, c), welches die Gleichung erfüllt, wird nach endlicher Zeit in der Ausgabeliste erscheinen. (8 Punkte) Aufgabe 2 (10 Punkte) Die Funktion lookup :: (Eq a) => a -> [(a, b)] -> Maybe b erwartet als Eingaben einen Schlüssel und eine Liste von (Schlüssel,Wert)-Paaren. Enthält die Liste einen Eintrag (Key,Wert), wobei Key der passende Schlüssel ist, so liefert lookup als Ergebnis Just Wert. Anderenfalls ist das Ergebnis Nothing. In der Vorlesung wurde eine Implementierung für lookup angegeben. Implementieren Sie die Funktion lookup unter Verwendung der foldl- oder der foldr-Funktion. Welche der beiden fold-Funktionen eignet sich besser? 1 Aufgabe 3 (15 Punkte) Betrachten Sie in dieser Aufgabe binäre Bäume nur mit Blattmarkierungen. Ein passender Datentyp dazu ist: data BBaum a = Blatt a | Knoten (BBaum a) (BBaum a) deriving(Eq,Show) Implementieren Sie in Haskell eine Funktion allePfade::BBaum a -> [(String,a)], die alle Pfade des Baumes von der Wurzel zu einem Blatt wie folgt ausgibt: Für jeden Pfad gibt es in der Ergebnisliste ein Paar (w, m), wobei m die Blattmarkierung ist und w der String ist, der den Pfad von der Wurzel zum Blatt darstellt: Der String ist eine Folge von Buchstaben ’l’ und ’r’, die an jeder Verzweigung angeben, ob der Pfad nach links oder nach rechts am Knoten geht. Z.B. wird der Baum 1 mm XXXXXXXXXX mmm XXXXX m m XXX+ m N >vm> ppp NNNNN >> p p NNN p > p N' wppp : 2 ::: :: :: : : 3 4 5 6 als BBaum Int dargestellt durch beispiel = Knoten (Knoten (Blatt 1) (Blatt 2)) (Knoten (Knoten (Blatt 3) (Blatt 4)) (Knoten (Blatt 5) (Blatt 6))) und der Wert von (allePfade beispiel) ist [("ll",1),("lr",2),("rll",3),("rlr",4),("rrl",5),("rrr",6)] 2