TU Wien:Funktionale Programmierung VU (Knoop)/Prüfung 2011-06-09
Zur Navigation springen
Zur Suche springen
Die Aufgaben waren wieder sehr ähnlich den letzten Prüfungen mit ein paar kleinen Gemeinheiten.
Aufgabe 1[Bearbeiten | Quelltext bearbeiten]
z.B: mnr = [0,1,2,3,4,5,6]
t2 = (\x y z -> y.z.z);
-- t2 :: a -> (b -> c) -> (b -> b) -> b -> c
t3 = t2 sum reverse reverse mnr
-- t3 == [6,5,4,3,2,1,0]
p (e:t) = 2 * (p t) + e - p t
p _ = 100;
t7 = (p [mnr!!5, mnr!!6], p mnr)
-- t7 = (111,121)
Aufgabe 2[Bearbeiten | Quelltext bearbeiten]
Polymorphen Datentyp TTree definieren: darzustellen ist ein Ternärer Baum mit einem polymorphen Datentyp und Null.
data TTree a = Nil | Node a (TTree a) (TTree a) (TTree a)
Aufgabe 3[Bearbeiten | Quelltext bearbeiten]
Zeichnen sie einen Baum mit genau zwei Knoten die die String Werte "a" und "bc" enthalten und geben sie den Haskell-Syntax an.
baum = Node "a" Nil Nil (Node "bc" Nil Nil Nil)
Aufgabe 4[Bearbeiten | Quelltext bearbeiten]
Durchmustern des ganzen Baumes, und True, falls immer alle Subknoten in allen Subbäumen größer sind, als der Wert eines Knotens
alleGroesser :: Ord a => (TTree a) -> Bool
alleGroesser Nil = True
alleGroesser (Node a one two three) =
if alleGroesserAls one min
&& alleGroesserAls two min
&& alleGroesserAls three min then True
else False
where
min = a
alleGroesserAls :: Ord a => (TTree a) -> a -> Bool
alleGroesserAls Nil _ = True
alleGroesserAls (Node a one two three) min =
if a > min
&& (alleGroesserAls one newMin)
&& (alleGroesserAls two newMin)
&& (alleGroesserAls three newMin) then True
else False
where
newMin = a
Elegantere Lösung:
flatten :: TTree a -> [a]
flatten Nil = []
flatten (Node a l m r) = [a] ++ flatten l ++ flatten m ++ flatten r
alleGroesser :: Ord a => TTree a -> Bool
alleGroesser Nil = True
alleGroesser (Node a l m r)
| filter (<a) (flatten l ++ flatten m ++ flatten r) == [] = True && alleGroesser l && alleGroesser m && alleGroesser r
|otherwise = False
Aufgabe 5[Bearbeiten | Quelltext bearbeiten]
Alle Werte in irgendeiner Reihenfolge ausgeben, die größer sind, als der übergebene Wert.
groesserAls :: Ord a => (TTree a) -> a -> [a]
groesserAls Nil _ = []
groesserAls (Node a one two three) min =
if a > min then
[a]
++ (groesserAls one min)
++ (groesserAls two min)
++ (groesserAls three min)
else
(groesserAls one min)
++ (groesserAls two min)
++ (groesserAls three min)
Elegantere Lösung (flatten-Funktion von Aufgabe 4 benötigt!):
alleGroesserAls :: Ord a => TTree a -> a -> [a]
alleGroesserAls Nil _ = []
alleGroesserAls tree a = filter (>a) (flatten tree)