TU Wien:Funktionale Programmierung VU (Knoop)/Prüfung 2009-01-22

Aus VoWi
Zur Navigation springen Zur Suche springen

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)