Sie sind auf Seite 1von 2

Ubungen

zu den Vorlesungen
Algorithmen und Datenstrukturen und Programmieren in Haskell
Universitat Bielefeld, WS 2016/2017
Prof. Dr. Markus Nebel M.Sc. Pina Krell
https://bis.uni-bielefeld.de/elearning/sites/3290

Ubungsblatt
7 vom 5.12.2015
Abgabe (online) bis kommenden Montag, den 12.12., 12:15 Uhr.
Aufgabe 1
(3 Punkte)

Auf unserem ersten Ubungsblatt


haben wir die Fibonacci-Folge betrachtet. Es wurde eine Funktion fib
implementiert, die f
ur eine gegebene Zahl i die ite Zahl der Fibonacci-Folge berechnet. Eine mogliche
L
osung k
onnte wie folgt aussehen:
> fib 1 = 1
> fib 2 = 1
> fib i = fib (i-1) + fib (i-2)
1. Implementiere nun eine Variante fiba :: Int -> Int dieser Funktion, die einen Array der Lange n
erzeugt, welcher die ersten n Elemente der Fibonacci-Folge enthalt, und anschlieend das letzte
Element zur
uckgibt. Tipp: Zum Bef
ullen des Arrays muss eine Liste angegeben werden. Diese

kann zum Teil mittels List Comprehension erzeugt werden. Bei der Konstruktion der Teilliste f
ur
Elemente gr
oer 2, kann auf bereits gef
ullte Elemente zur
uckgegriffen werden ohne die Funktion
erneut aufzurufen. Dazu sollte die Konstruktion des Arrays in einer where-Klausel erfolgen, z.B.:
fiba i = a!i where a = array ...
2. Vergleiche nun den Aufwand der beiden Implementierungen. Rufe zunachst das ghci-Kommando
:set +s auf, um f
ur die darauffolgenden Befehle die Laufzeit ausgeben zu lassen. Bestimme dann die
ite Fibonacci-Zahl f
ur alle i {10, 15, 20, 25, 30} mit beiden Implementierungen. Welche Laufzeiten
erh
altst du?
3. Warum ist fiba schneller als fib?

Aufgabe 2
(2 Punkte)
Harry Hacker hat die Bin
arzahlen modelliert und u
berlegt, dass es praktisch ware, die Relationen <, >,
und zu haben, also benutzt er deriving Ord.
data Bit = I | O deriving (Show, Eq, Ord)
Hat das den gew
unschten Effekt? Woran liegt das?

Aufgabe 3
(6 Punkte)
Im Folgenden wollen wir den in der Vorlesung kennengelernten Datentyp Tree und die Technik der
strukturellen Rekursion vertiefen.
1. Schreibe eine Funktion square :: (Num a) => Tree a -> Tree a, welche die Werte an allen Bl
attern eines gegebenen Baums quadriert.
2. Erweitere den Datentypen Tree a auf einen Datentyp WTree a f
ur gewichtete Baume, d.h. jede
Kante im Baum bekommt ein Gewicht bzw. eine Kantenlange zugeordnet. Erweitere dazu eine
Verzweigung im Baum um zwei Kantengewichte des Typs Float.
3. Schreibe eine Funktion sumWeights :: WTree a -> Float, welche alle Kantenlangen im Baum
aufsummiert.

Aufgabe 4
(6 Punkte)
Bestimme die Worst-Case-Laufzeiteffizienz der folgenden beiden Implementierungen der Funktion power
f
ur Problemgr
oe n unter Verwendung der angegebenen Konstanten. Gib f
ur beide Ergebnisse jeweils
eine (m
oglichst einfache) asymptotische Schranke an.
pow1 :: (Num a, Integral b) => a -> b -> a
pow1 x 0 = 1
pow1 x n = x * pow1 x (n-1)

{c1 }
{c2 }

pow2 :: (Num a, Integral b) => a -> b -> a


pow2 x 0
= 1
pow2 x n
| n mod 2 == 0 = y
| otherwise
= y * x
where y
= pow2 (x * x) (n div 2)

{k1 }
{k2 }
{k3 }

Zeige, dass in beiden F


allen die Multiplikation eine charakteristische Operation ist.
Aufgabe 5
(3 Punkte)
-Ausdr
ucke erlauben es Funktionen zu definieren, ohne einen Namen zu benotigen. Dies ist besonders
praktisch, wenn Funktionen als Parameter u
bergeben werden: map (\x -> x+1) erhoht alle Elemente
(Zahlen) einer Liste um 1 und hat den Typ [Int] -> [Int].
Schreibe Haskell-Funktionen, die folgendes bewerkstelligen:
1. aus jedem Tupel von Zahlen (n, m) eine Liste ihrer arithmetischen mittel berechnen,
2. jeder Zahl n einer Liste Nothing zuordnen, falls n negativ ist und sonst Just n,
3. jeden Baum (Ausdr
ucke vom Typ Tree a) in einer Liste in eine Beschreibung (Leerer Baum,
Blatt oder Komplexer Baum) umformen,
indem du map, -Ausdr
ucke und falls n
otig case-Ausdr
ucke verwendest. Vergiss nicht: Gebe jeweils die
Signatur an!
Tipp: Beschreibungen zu Lambda-Audr
ucken findest du im Buch Haskell-Intensivkurs (Block M., Neumann A.), in Kapitel 3.3, sowie Kapitel 19. Das Buch steht per Online-Zugriff aus den Universitats-Netz
frei zur Verf
ugung und ist zu finden unter dem folgenden Link:
http://www.springer.com/us/book/9783642047176.
Erl
auterungen in englischer Sprache finden sich im Haskell Online-Tutorial unter dem Abschnitt Lambdas
zu finden unter dem folgenden Link:
http://learnyouahaskell.com/higher-order-functions.