Lehrstuhl für Softwaretechnik und Programmiersprachen
Jens Bendisposto
Funktionale Prorammierung – WS 13/14
Übungsblatt 1
Aufgabe 1.1 (Sequenzen)
In dieser Aufgabe sollen Sie einfache Sequenzen erzeugen. Ein Beispiel: Wenn die Aufgabe ist
die Sequenz zu definieren, die die Zahlen zwischen -100 und 100 beinhaltet, könnte Ihre Lösung
so aussehen: (def beispiel-seq (range -100 101))
a) Definieren sie die Sequenz, die alle ganzen Zahlen von 100 bis -100 in absteigender Reihenfolge
beinhaltet.
b) Definieren sie die Sequenz, die alle geraden Zahlen von 0 bis 1000 beinhaltet.
c) Definieren sie die Sequenz, die alle Quadratzahlen zwischen 0 bis 1000 beinhaltet.
d) Definieren sie die Sequenz, die alle Tupel [n, m]von ganzen Zahlen beinhaltet für die gilt:
0 < n < 1000 ∧ n2 < m ∧ m ist minimal. Die Sequenz beginnt also mit [1,2], [2,5], [3,10], ...
e) Definieren sie die Sequenz, die alle Zahlen mit genau 5 Ziffern (dargestellt als 5 Tupel), die
ein Palindrom sind enthält, es soll ausserdem gelten, dass die Ziffern bis zur mittleren Zahl
strikt aufsteigend sind. [0 2 3 2 0] ist also Teil der Sequenz, aber nicht [0 3 2 3 0] oder [1 1 1
1 1].
Aufgabe 1.2 (Ziegenproblem)
Das Ziegenproblem (http://de.wikipedia.org/wiki/Ziegenproblem) ist ein nicht-intuitives
Phänomen in der Wahrscheinlichkeitsrechnung. Ein Kandidat darf sich für eine für eine von
drei Türen entscheiden. Hinter einer Türe ist ein Preis, hinter den anderen Beiden eine Niete
versteckt. Hat sich der Kandidat für eine Türe entschieden, wird eine von den beiden nicht
gewählten Türe geöffnet hinter der eine Niete ist. Der Kandidat darf sich nun entweder umentscheiden und die noch nicht geöffnete Türe wählen oder bei seiner Wahl bleiben.
Entgegen der Intuition ist es für den Kandidaten nicht unwichtig, ob er bei seiner Wahl bleibt
oder nicht. Die Wahrscheinlichkeit einen Preis zu bekommen ist höher, wenn sich der Kandidat
umentscheidet.
a) Schreiben Sie eine Funktion (defn experiment1 [] ...), die ein einzelnes Experiment
durchführt. Der Kandidat soll sich dabei immer umentscheiden. Die Funktion soll true liefern,
wenn der Kandidat den Preis gewinnt.
b) Schreiben Sie eine Funktion (defn experiment2 [] ...), die ein einzelnes Experiment
durchführt. Der Kandidat soll sich dabei zufällig neu entscheiden. Die Funktion soll true
liefern, wenn der Kandidat den Preis gewinnt.
c) Schreiben Sie eine Funktion (defn run[n f] ...), die das Experiment f insgesamt n mal
durchführt und die Ergebnisse zählt. Ein Aufruf soll so aussehen:
user=> (run 100000 experiment1)
{false 33250, true 66750}
Aufgabe 1.3 (Perfekte Zahlen)
a) Schreiben Sie eine Funktion (defn perfect? [n] ...), die ausrechnet, ob n eine perfekte
Zahl ist, d.h. die Zahl ist gleich der Summe ihrer echten Teiler. Bsp.: 6 ist die erste perfekte
Zahl, denn 6 = 1 + 2 + 3
b) Schreiben Sie eine Funktion (defn next-perfect [n] ...) , die eine ganze Zahl als Eingabe
bekommt und ausgehend von dieser Zahl die nächsthöhere perfekte Zahl findet.
c) Welchen Wert hat (next-perfect 7)?
Aufgabe 1.4 (Fibonacci)
Die Folge der Fibonacci Zahlen beginnt mit F0 = 0 und F1 = 1. Jedes weitere Folgenglied ist
die Summe der beiden vorangehenden Glieder: Fn = Fn−1 + Fn−2
a) Schreiben Sie eine Funktion, die eine ganze Zahl z als Eingabe bekommt und eine Sequenz
mit den ersten z Fibbonaccizahlen erzeugt.
b) Testen Sie Ihre Funktion auch einmal mit 100.
Aufgabe 1.5 (Duplikate entfernen)
Gegeben sei ein Vektor v, der Duplikate enthalten kann. Schreiben Sie eine Funktion remove-duplicates,
die alle Duplikate aus dem Vektor entfernt, dabei aber die Reihenfolge der Elemente nicht modifiziert.
Die Funktion soll beispielsweise so aufgerufen werden:
user=>
()
user=>
()
user=>
(1 2)
user=>
(1 2 3
(remove-duplicates [])
(remove-duplicates nil)
(remove-duplicates [1 2 1])
(remove-duplicates [1 2 3 "dd" 2 :a 3])
"dd" :a)