21.07.2013 Aufrufe

Universität Passau - NELLI

Universität Passau - NELLI

Universität Passau - NELLI

MEHR ANZEIGEN
WENIGER ANZEIGEN

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))

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!