Grundlagen der Programmierung 2 Aufgabenblatt Nr. 2 Aufgabe 1

Werbung
Prof. Dr. Manfred Schmidt-Schauß
Künstliche Intelligenz/Softwaretechnologie
Fachbereich Informatik und Mathematik/ Institut für Informatik
Goethe-Universität Frankfurt am Main
Grundlagen der Programmierung 2
Sommersemester 2016
Aufgabenblatt Nr. 2
Abgabe: Mittwoch 27. April 2016 vor! der Vorlesung
Aufgabe 1 (20 Punkte)
Die Funktionen f1 bis f5 seien in Haskell definiert als:
f1
f2
f3
f4
f5
x
x
x
x
x
=
=
=
=
=
f3 (f5
if (f5
if x <
x*44 +
if x >
(if x > 1000 then x-100 else 100))
(x+20)) > 30 then f3 x else f1 x
0 then f3 1 else x*270416
f3 (x*88)
77 then f1 (f4 (x+1)) else f5 (x+20)
a) Für welche Funktionen fi, fj (1 ≤ i, j ≤ 5) gilt:
Die Funktion fi referenziert Funktion fj direkt?
(4 Punkte)
b) Für welche Funktionen fi, fj (1 ≤ i, j ≤ 5) gilt:
Die Funktion fi referenziert die Funktion fj?
(4 Punkte)
c) Welche der Funktionen fi mit 1 ≤ i ≤ 5 sind direkt rekursiv?
(4 Punkte)
d) Welche der Funktionen fi mit 1 ≤ i ≤ 5 sind rekursiv?
(4 Punkte)
e) Welche Paare (fi, gj) mit 1 ≤ i < j ≤ 5 sind verschränkt rekursiv?
(4 Punkte)
Aufgabe 2 (10 Punkte)
Die Funktionen f1, f2, f3 und f4 seien in Haskell definiert als:
f1 x y z
f2 x y z
f3 x y z
f4 x y z
= if x > y then f1 (x+2) (y-1) z else y
= if z /= 0 then y + x + f2 (x-1) (y-1) (z-2) else 1
= if y < 0 then True
else (f3 (f3 (x-2) (y-4) (z-6)) (4*y) (z-2)) + (f3 6 (y-2) (z*2))
= if z > 0 then (f4 (x-y) (y+1) (x-z)) + (f4 2 x z) else y+x-(2*z)
Vervollständigen Sie die folgende Tabelle:
. . . ist iterativ
. . . ist endrekursiv
. . . ist linear rekursiv
. . . ist Baum-rekursiv
. . . ist geschachtelt Baum-rekursiv
f1
ja /
ja /
ja /
ja /
ja /
f2
ja /
ja /
ja /
ja /
ja /
nein
nein
nein
nein
nein
1
nein
nein
nein
nein
nein
f3
ja /
ja /
ja /
ja /
ja /
nein
nein
nein
nein
nein
f4
ja /
ja /
ja /
ja /
ja /
nein
nein
nein
nein
nein
Aufgabe 3 (50 Punkte)
Die Funktion fun sei definert als
fun i j = if i-j <= 30 then j*2 else i+(fun (i-5) (j+5))
Geben Sie für alle Teilaufgaben jeweils sämtliche Reduktionsschritte sowie die jeweils verwendete
Regel als Buchstabe D, A oder I an (D = Definitionseinsetzung, A=Arithmetische Auswertung,
I=if-Auswertung).
a) Werten Sie fun (2*(24+1)) (13-3) in normaler Reihenfolge aus.
(15 Punkte)
b) Werten Sie fun (fun (2*20) (13-3)) (fun (2*3) (20-17)) in applikativer Reihenfolge
aus.
(15 Punkte)
c) Werten Sie den Ausdruck fun (2*18) (2*2) in verzögerter Reihenfolge aus. (20 Punkte)
Aufgabe 4 (20 Punkte)
Eine Schlange von paarweise verschiedenen nicht-negativen ganzen Zahlen sei in Haskell durch
die Funktionen
anfang
:: Integer
dahinter :: Integer -> Integer
modelliert, so dass
• anfang die Zahl am Anfang der Schlange liefert.
• dahinter i jene Zahl liefert, die sich direkt hinter der Zahl i in der Schlange befindet.
Dabei kodiert −1 das Ende der Schlange.
Ein Beispiel für eine solche Schlange und die passenden Funktionsdefinitionen in Haskell:
anfang
= 20
dahinter 20 = 10
dahinter 10 = 5
dahinter 5 = 30
dahinter 30 = 25
20 10 5 30 25 37 2 11 31
dahinter 25 = 37
dahinter 37 = 2
dahinter 2 = 11
dahinter 11 = 31
dahinter _ = -1
Implementieren Sie in Haskell die folgenden Funktionen für solche Schlangen. Die Funktionen
müssen dabei für alle (korrekten) Implementierungen von anfang und dahinter korrekt arbeiten.
a) Eine (0-stellige) Funktion letztes :: Integer, welche die letzte Zahl der Schlange
berechnet. Für obiges Beispiel soll letzte den Wert 31 liefern.
(5 Punkte)
b) Eine Funktion ktes :: Integer -> Integer, welche die k-te Zahl der Schlange ausgibt.
Dabei entspricht ktes 1 der Funktion anfang. Falls k echt größer als die Anzahl der Elemente ist, dann soll mithilfe der Funktion error eine Fehlermeldung ausgegeben werden,
zum Beispiel error "Zu wenige Elemente". Für die obige Schlange soll ktes 3 den Wert
5 liefern.
(7 Punkte)
c) Eine endrekursive (0-stellige) Funktion summe :: Integer, welche die Summe der Zahlen einer Schlange berechnet. Für die obige Schlange sollte summe den Wert 171 liefern.
(8 Punkte)
2
Herunterladen