TU Wien:Funktionale Programmierung VU (Knoop)/Prüfung 2009-01-22
Beispiel 1 (50%)
Ein paar Ausdrücke im Zusammenhang mit der Matrikelnummer auswerten bzw. einen "allgemeinsten Typen" hinschreiben. An folgendes kann ich mich erinnern:
Beispielname: "Willy", MatrNr: [1,2,3] ---------------------------------------- ( (head matrnr) (head name) ) = (0, 'W') [ [i+1] | i <- matnr ] = [[2],[3],[4]] [ i | i <- matnr, i < 2] = [1]
Hier fehlen noch mind. 4 Beispiele. Bitte nachtragen, wenn man sich erinnern kann
Beispiel 2 (50%)
Einen polymorphen binären Baum definieren, der polymorphe Blätter hat. Zusätzlich ein Element normHeit (hat anders geheißen), das anzeigt, welcher Ast mehr Blätter hat. NR == rechter Ast hat mehr Blätter, NL == linker Ast hat mehr Blätter, NN == beide Äste haben gleich viele Blätter.
Gegeben:
data normHeit = NR | NL | NN deriving (Show, Eq, und noch 10 Sachen);
Gefragt: 1. Der binäre Baum Code:
data ordTree a = Leaf a | Node a normHeit (ordTree a) (ordTree a)
2. Ein konkretes Beispiel mit 2 Knoten Code:
Node 1 NR (Node 2 NR (Leaf 3) (Leaf 4)) (Leaf 5)
Code:
Meiner Meinung richtig: Node 1 NL (Node 2 NN (Leaf 3) (Leaf 4)) (Leaf 5)
3.. Implementieren einer Funktion "normiert :: ordTree a -> Bool", die zurückgibt, ob das Attribut normHeit in allen Knoten stimmt. Code:
anzBlaetter :: ordTree a -> Integer anzBlaetter (Leaf i) = 1 anzBlaetter (Node i n l r) = (anzBlaetter l) + (anzBlaetter r)
normiert :: ordTree a -> Bool normiert (Leaf i) = True normiert (Node i n l r) | (n == NR) = ((anzBlaetter r) > (anzBlaetter l)) && (normiert r) && (normiert l) | (n == NL) = ((anzBlaetter r) < (anzBlaetter l)) && (normiert r) && (normiert l) | (n == NN) = ((anzBlaetter r) == (anzBlaetter l)) && (normiert r) && (normiert l)