Universität Passau - NELLI
Universität Passau - NELLI
Universität Passau - NELLI
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Prof. Dr. Peter Hubwieser<br />
Matthias Spohrer<br />
Margret Bauer<br />
Alexander Staller<br />
Aufgabe 37 Haskell<br />
Siehe Skript von Hermann Puhlmann<br />
Aufgabe 38: Verschränkte Rekursion<br />
Technische <strong>Universität</strong> München<br />
Fakultät für Informatik<br />
Lösungsvorschlag<br />
Kursbrief 7b<br />
a) function anzahlEinsMod3(natlist ls) : bool<br />
return rest1_0(ls)<br />
function rest1_0( natlist ls) : bool<br />
return if isempty(ls) then true<br />
else if ls.head = 1 then rest1_1(ls.rest)<br />
else rest1_0(ls.rest)<br />
fi<br />
fi<br />
function rest1_1( natlist ls) : bool<br />
return if isempty(ls) then false<br />
else if ls.head = 1 then rest1_2(ls.rest)<br />
else rest1_1(ls.rest)<br />
fi<br />
fi<br />
function rest1_2( natlist ls) : bool<br />
return if isempty(ls) then false<br />
else if ls.head = 1 then rest1_0(ls.rest)<br />
else rest1_2(ls.rest)<br />
fi<br />
fi<br />
b) anzahlEinsMod3 :: [Int] -> Bool<br />
anzahlEinsMod3 ls = rest1_0 ls<br />
rest1_0 :: [Int] -> Bool<br />
rest1_0 [] = True<br />
rest1_0 (1:rest) = rest1_1 rest<br />
rest1_0 (head:rest) = rest1_0 rest<br />
rest1_1 :: [Int] -> Bool<br />
rest1_1 [] = False<br />
rest1_1 (1:rest) = rest1_2 rest<br />
rest1_1 (head:rest) = rest1_1 rest<br />
rest1_2 :: [Int] -> Bool<br />
Nachqualifizierungskurs<br />
2002-2004<br />
Ablaufmodellierung<br />
– Kursbrief 7b-LSG
est1_2 [] = False<br />
rest1_2 (1:rest) = rest1_0 rest<br />
rest1_2 (head:rest) = rest1_2 rest<br />
Aufgabe 39: Currying in Haskell (1)<br />
a) function istEnthalten (charlist ls, char z) : bool<br />
return if isempty(ls) then false<br />
else if ls.head = z then true<br />
fi<br />
b) In Haskell ergeben sich daraus folgende Funktionen:<br />
fi<br />
else istEnthalten(ls.rest,z)<br />
istEnthaltenListe :: String -> (Char -> Bool)<br />
istEnthaltenListe "" z = False<br />
istEnthaltenListe (head:rest) z<br />
und<br />
| head == z = True<br />
| otherwise = istEnthaltenListe rest z<br />
istEnthaltenZeichen :: Char -> (String -> Bool)<br />
istEnthaltenZeichen z "" = False<br />
istEnthaltenZeichen z (head:rest)<br />
| head == z = True<br />
| otherwise = istEnthaltenZeichen z rest<br />
Als Anwendungsbeispiele könnten sich z.B. folgende Aufrufe der beiden Funktionen ergeben:<br />
istInMeinerListe :: Char -> Bool<br />
istInMeinerListe z = istEnthaltenListe "abcdefghijk" z<br />
bzw. alternativ<br />
istInMeinerListe = istEnthaltenListe "abcdefghijk"<br />
und<br />
enthaeltMeinZeichen :: String -> Bool<br />
enthaeltMeinZeichen ls = istEnthaltenZeichen 'm' ls<br />
bzw. alternativ<br />
enthaeltMeinZeichen = istEnthaltenZeichen 'm'<br />
Durch die alternativen Definitionen ohne Parameter werden den Funktionssymbolen<br />
istInMeinerListe bzw. enthaeltMeinZeichen wieder Funktionssymbole mit der<br />
gleichen Funktionalität zugewiesen.<br />
Die folgenden Aufrufe werden dann zu True, False, False, True ausgewertet:<br />
>istInMeinerListe 'a'<br />
>istInMeinerListe 'z'
enthaeltMeinZeichen "hallo"<br />
>enthaeltMeinZeichen "montagmorgen"<br />
Aufgabe 40: Currying in Haskell (2)<br />
Durch die Funktion erzeugeIntervall bekommt man die Liste [a, a+i, a+2i, a+3i, ..., a+ni]<br />
( n ∈ N), wobei a + ni ≤ b und a + ( n + 1)<br />
i > b . a, b und i (mit i>0) sind die Parameter der Funktion<br />
erzeugeIntervall.<br />
Die Signatur von erzeugeIntervall ist folgendermaßen:<br />
erzeugeIntervall :: Int -> (Int -> (Int -> [Int]))<br />
Durch die Funktion intervall bekommt man Listen mit der Schrittweite 1. Das Ergebnis hat<br />
also immer die Form [a, a+1, a+2, ..., b].<br />
Die Signatur von intervall lautet:<br />
intervall :: Int -> (Int -> [Int])<br />
Die Funktion standardIntervall erzeugt immer Listen der Art [0, 1, 2, ..., b]. Hier ist zusätzlich<br />
auch der Startwert schon gebunden.<br />
Die Signatur von standardIntervall lautet:<br />
standardIntervall :: Int -> [Int]<br />
Eine kürzere Definition für standardIntervall, die auf intervall zurückgreift, sieht so aus:<br />
standardIntervall = intervall 0<br />
Aufgabe 41: Funktionen höherer Ordnung in Haskell<br />
a) quadrat :: Int -> Int<br />
quadrat x = x*x<br />
quadratsumme :: [Int] -> Int<br />
quadratsumme ls = foldl (+) 0 (map quadrat ls)<br />
b) dreimal :: (Double -> Double) -> Double -> Double<br />
dreimal f x = f (f (f x))<br />
Zum Test können z.B. folgende Funktionsaufrufe verwendet werden:<br />
>dreimal negate 3<br />
>dreimal cos 1<br />
>dreimal sqrt(fromInt (quadrat 81))