13. ¨Ubung Informatik A WS 09/10

Werbung
13. Übung
Informatik A
Klaus Kriegel
WS 09/10
Abgabe: 03.02.2010, 10:00 Uhr
Das ist der letzte abgabepflichtige Übungszettel, mit dem man seinen Punktestand noch
einmal verbessern kann. Korrigiert werden die Aufgaben 2.b, 2.c, 3 und 4 (insgesamt
13 Punkte) aber auf das Soll werden nur 6 Punkte angerechnet.
Aufgabe 1:
Polymorphe Typbestimmung:
(0 Punkte)
Führen Sie für die folgenden Definitionen eine Typprüfung durch. Natürlich kann man
das auch von hugs erledigen lassen, aber Sie sollten üben, es selbst zu machen. Stellen
Sie fest, ob die Definitionen konsistent sind, und geben Sie bei positivem Ergebnis die
Signatur an:
f1 x
| x > 0
| otherwise
= True
= 12
f2 n
| ord n >= 6
| otherwise
= [n]
= "n"++[n]
f3 x y = show (div x 3) ++ y
f4 (x,y,z) = (x,[’1’..y],x++[z])
f5 x y z = [(x, mod x y)]++z
Aufgabe 2:
Lazy Evaluation
(0 + 1 + 2 Punkte)
a) Welche Liste von Zahlen ergibt der Aufruf
[ 10*x + y | x <- [0..9], y <- [0..9], z <- [2,5..17], x + y == z] ?
Geben Sie eine einfache Beschreibung dieser Liste und begründen Sie Ihre Antwort.
b) Wieviele Aufrufe des Operators == aus der letzten Bedingung erfolgen bei der Berechnung der gesamten Liste?
c) Wieviele Aufrufe des Operators == erfolgen bei der Berechnung von
head [ 10*x + y | x <- [0..9], y <- [0..9], z <- [2,5..17], x + y == z]
und bei der Berechnung von
head [ 10*x + y | x <- [1..9], y <- [1..9], z <- [2,5..17], x + y == z] ?
Aufgabe 3:
Goldbachsche Vermutung
(3 + 2 Punkte)
Die Goldbachsche Vermutung besagt, dass jede gerade Zahl k ≥ 4 als Summe von zwei
Primzahlen dargestellt werden kann (1 ist keine Primzahl!).
a) Definieren Sie eine Funktion prim :: Integer -> Bool mit der man testet, ob
der Eingabewert eine Primzahl ist. Beschreiben Sie danach mit List-Comprehension
eine Funktion goldbachSumme :: Integer -> [(Integer,Integer)] , die für jeden
geraden Eingabewert alle Zerlegungen dieser Zahl in die Summe aus zwei Primzahlen
berechnet, wobei jedes Paar (a,b) aus der Liste die Ungleichung a ≤ b erfüllen soll. Was
bei ungeraden Eingabewerten passiert ist egal.
b) Definieren Sie (möglichst in einer Zeile, d.h. ohne Rekursion und nur mit prim als
Hilfsfunktion) die Funktionen golbachListe :: [(Integer,Integer)] und
golbachMax :: Integer -> Integer . Die erste Funktion soll eine unendliche Liste
von Primzahlpaaren erzeugen deren Summe die Zahlen 4, 6, 8, . . . ergibt (nur ein Paar pro
Zahl). Die zweite Funktion soll bei Eingabe n die maximale Anzahl k von Primzahlpaaren
(a1 , b1 ), (a2 , b2 ), . . . (ak , bk ) angeben, so dass a1 ≤ b1 , a2 ≤ b2 , . . . , ak ≤ bk und a1 + b1 =
a2 + b2 = . . . = ak + bk ≤ n.
Aufgabe 4:
Strukturelle Induktion
(5 Punkte)
Die Funktionen average, magic :: Float -> Float -> Float sind wie folgt definiert:
average x y = (x + y)/2
-- (1)
magic x y
= x + 0.5 * y
-- (2)
Beweisen Sie mit vollständiger Induktion, dass für beliebige Float-Listen xs die Aufrufe
2* foldr average 0 xs und foldr magic 0 xs den gleichen Wert berechnen.
Die Zeilennummerierung in der Definition kann zur Begründung der Schritte herangezogen werden.
Herunterladen