Aufgabe 2 - Goethe

Werbung
Prof. Dr. Manfred Schmidt-Schauß
Künstliche Intelligenz/Softwaretechnologie
Fachbereich Informatik und Mathematik/ Institut für Informatik
Goethe-Universität Frankfurt am Main
Grundlagen der Programmierung 2
Sommersemester 2011
Aufgabenblatt Nr. 4
Abgabe: Mittwoch 11. Mai 2011 vor! der Vorlesung
Aufgabe 1 (20 Punkte)
Gegeben Sie die folgenden mathematischen Funktionen als anonyme Funktionen in Form von
Lambda-Ausdrücken in Haskell Notation an.
a) f1 (a, b) = 2a2 + 2ab + 2b2
q
b) f2 (p, q) = −( p2 ) + ( p2 )2 − q
Zur Wurzelberechnung steht in Haskell die Funktion sqrt bereit.
c) f3 (f, g, h, x) = h(f (g(x)), g(f (x)))
Aufgabe 2 (50 Punkte)
Geben Sie List Comprehensions in Haskell an, die folgende Listen darstellen:
a) Die unendliche Liste aller Zahlen der Form 3n + 4, wobei n eine natürliche Zahl ist, d.h.
[7,13,31,85,247,...
(10 Punkte)
b) Die unendliche Liste aller natürlichen Quadratzahlen, die durch 5 ohne Rest teilbar sind, aber
nur mit Rest durch 20 teilbar sind, d.h. [25,225,625,1225,2025,3025,...
(10 Punkte)
c) Die Liste aller echten Teiler einer gegebenen Zahl n, z.B. soll für n = 18 die Liste [1,2,3,6,9]
generiert werden.
(10 Punkte)
d) Die unendliche Liste der perfekten Zahlen, wobei eine natürliche Zahl n perfekt heißt, wenn
die Summe aller ihrer Teiler, die ungleich n sind, wiederum m ergibt. Z.B. ist 6 perfekt, denn
1 + 2 + 3 = 6.
(10 Punkte)
e) Die unendliche Liste aller Paare (a, b) von natürlichen Zahlen a und b, wobei a durch drei teilbar
ist und b eine Quadratzahl ist. Hierbei sollen die Paare in einer fairen Reihenfolge generiert
werden. Fair bedeutet: Jedes Element wird in endlicher Zeit generiert, oder auch: Wenn xs die
Liste der Paare ist, dann terminiert (a,b) ‘elem‘xs für alle Zahlen a, b mit a ist durch drei
teilbar und b ist eine Quadratzahl.
(10 Punkte)
Aufgabe 3 (30 Punkte)
Folgende polymorphe Datenstruktur beschreibt einen binären Baum mit Knoten- und Blattmarkierungen in Haskell:
1
data Baum a b = Blatt a | Knoten b (Baum a b) (Baum a b) deriving(Show,Eq)
Ein Turnierbaum ist ein binärer Baum, der an jedem Blatt mit den Namen einer Mannschaft und an
jedem inneren Knoten mit einem Tupeln von (natürlichen) Zahlen markiert ist.
type Turnierbaum = Baum
String
-- Mannschaftsname
(Int,Int) -- Spielergebnis
Zu Beginn (in der ersten Runde) eines Turniers spielen die beiden Mannschaften, die einen gemeinsamen Elternknoten besitzen gegeneinander. Das Spielergebnis wird in der Markierung des Elternknoten notiert, wobei die Punkte des rechten Kindes im rechten Element des Markierungstupels
und die Punkte des linken Kindes im linken Element des Tupels gespeichert werden. In der i-ten
Runde des Turniers spielen die beiden Gewinner der (i−1)-ten Runde gegeneinander, die einen gemeinsamen Elternknoten besitzen. In folgendem Beispiel spielt in der ersten Runde Mannschaft A gegen
Mannschaft B und Mannschaft C gegen D. In der zweiten Runde spielen die Gewinner der beiden
Spiele gegeneinander (Mannschaft A gegen Mannschaft C).
(1, 0)
A
zz
zz
z
z
zz
mm
mmm
m
m
m
mmm
mmm
(4, 7) Q
QQQ
QQQ
QQQ
QQQ
Q
(2, 1)
DD
DD
DD
DD
B
C
zz
zz
z
z
zz
DD
DD
DD
DD
D
a) Geben Sie den Beispielbaum als Instanz des Typs Turnierbaum in Haskell an.
(10 Punkte)
b) Implementieren Sie eine Funktion alleMannschaften :: Turnierbaum -> [String] in
Haskell, die alle an dem Turnier teilnehmenden Mannschaften berechnet.
(10 Punkte)
c) Implementieren Sie eine Funktion gewinner :: Turnierbaum -> String in Haskell, die anhand
eines gegebenen Turnierbaums den Gewinner des Turniers berechnet. Im Beispiel ist Mannschaft
C der Gewinner.
(10 Punkte)
2
Herunterladen