Aufgabe 2 (10 Punkte) - Goethe

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