TU Wien:Funktionale Programmierung VU (Knoop)/Prüfung 2010-03-04
Zur Navigation springen
Zur Suche springen
An die exakten Fragestellungen kann ich mich nicht mehr erinnern, die Angabe war aber im Prinzip sehr ähnlich zu den letzten Prüfungen (keine Theorie, nur Praxisbespiele mit Bäumen).
Bsp 1[Bearbeiten | Quelltext bearbeiten]
war wieder die Bestimmung des Typs/Werts von ein paar Ausdrücken
Bsp 2[Bearbeiten | Quelltext bearbeiten]
war ein polymorpher, binärer Baum. Kein spezieller Typ für Leaves, sondern einfach Knoten mit Nil als Nachfolger. Jeder Knoten hält ein Integer und ein polymorphes Element
Lösung:[Bearbeiten | Quelltext bearbeiten]
data BTree a =
Nil
| Node Integer a (BTree a) (BTree a)
ttree :: BTree Char
ttree = (Node 10 'a' (Node 12 'b' Nil (Node 21 'c' Nil Nil)) Nil)
Bsp 3[Bearbeiten | Quelltext bearbeiten]
eine Funktion, die bestimmt, ob der Baum "aufsteigend" ist, d.h. ob der Integer-Wert in alle Child-Knoten kleiner ist als im aktuellen, + ob alle Kind-Bäume auch aufsteigend sind
Lösung:[Bearbeiten | Quelltext bearbeiten]
-- Loesung
-- Baispielaufruf:
-- aufsteigend ttree
data BTree a =
Nil
| Node Integer a (BTree a) (BTree a)
ttree :: BTree Char
ttree = (Node 10 'a' (Node 12 'b' Nil (Node 21 'c' Nil Nil)) Nil)
aufsteigend :: BTree a -> Bool
aufsteigend Nil = True
aufsteigend tree@(Node val _ t1 t2) =
let
list = getList tree
in
(allBigger val (tail list)) &&
(aufsteigend t1) &&
(aufsteigend t2)
getList :: BTree a -> [Integer]
getList Nil = []
getList (Node val _ t1 t2) = (val:[]) ++ (getList t1) ++ (getList t2)
allBigger :: Integer -> [Integer] -> Bool
allBigger _ [] = True
allBigger x (e:list)
| x < e = (allBigger x list)
| otherwise = False
Lösung alternativ:[Bearbeiten | Quelltext bearbeiten]
tree1 = (Node 1 'a' (Node 2 'b' Nil (Node 3 'c' Nil Nil)) Nil) -- ascending == True
tree2 = (Node 99 'a' (Node 2 'b' Nil (Node 3 'c' Nil Nil)) Nil) -- ascending == False
tree3 = (Node 1 'a' (Node 2 'b' (Node 3 'c' Nil Nil) (Node 3 'c' Nil Nil)) (Node 2 'b' Nil Nil)) -- ascending == True
tree4 = (Node 1 'a' (Node 2 'b' (Node 1 'c' Nil Nil) (Node 3 'c' Nil Nil)) (Node 2 'b' Nil Nil)) -- ascending == False
ascending :: (BTree a) -> Bool
ascending Nil = True
ascending (Node x c left right) = and [smaller left x, smaller right x]
smaller :: (BTree a) -> Integer -> Bool
smaller Nil _ = True
smaller (Node x c left right) y = and [y > x, smaller left x, smaller right x] EDIT: y<x to y>x
Bsp 4[Bearbeiten | Quelltext bearbeiten]
eine Funktion, die die polymorphen Elemente aller Knoten zurückgibt, deren Integer-Wert höher als x ist
Lösung[Bearbeiten | Quelltext bearbeiten]
b :: (BTree a) -> Integer -> [a]
b Nil _ = []
b (Node x c left right) y
| x > y = c : (b left y) ++ (b right y)
| otherwise = (b left y) ++ (b right y)