4. Listen
4.1 Listen bauen
Listen sind ja ein Datentyp, der beliebig viele Elemente enthalten kann. Wenn wir also Code schreiben, dann wissen wir zum Zeitpunkt nicht, wie lang die Listen, mit denen wir arbeiten, sein werden. Wir müssen also mit endlichem Code beliebig große Listen verarbeiten können. Das geht letztendlich nur mit Rekursion. Ich stelle Ihnen jetzt ein paar Beispielfunktionen vor. Danach machen Sie bitte ein paar Übungen.
Beispiel
Ich will eine Funktion range a b
schreiben, die
mir die Liste aller natürlichen Zahlen von \(a\) bis \(b\) liefert:
range : Int -> Int -> List Int
range a b =
if a > b then
[]
else
a :: range (a + 1) b
Zur Erklärung: die Funktion gibt die Liste aller
natürlichen Zahlen \(x\) mit \(a \leq x \leq b\) aus.
Wenn \(a \gt b\), dann ist diese Liste leer: es gibt
keine solchen Zahlen \(x\). Dies ist der Basisfall der Rekursion
in Zeile 6-7. Wenn \(a \leq b\) ist, dann ist natürlich
\(a\) selbst die kleinste Zahl der Liste. Der Rest der
Liste, das sind dann die Zahlen von \(a+1\) bis \(b\).
Wir stellen also mit dem rekursiven Aufruf
range (a+1) b
die Liste
\([a+1, a+2, \dots, b]\) her und fügen dann zum Schluss das
\(a\) am Anfang ein. All dies geschieht in Zeile 10. Jetzt
können wir es ausprobieren:
range 8 13
[8,9,10,11,12,13] : List Int
range 4 2
[] : List Int
Übungsaufgabe Modifizieren Sie die obige Funktion, so dass im Fall \(a \gt b\) die Liste in absteigender Form ausgegeben wird:
range 8 6
[8, 7, 6] : List Int
Übungsaufgabe
Schreiben Sie eine Funktion
repeat howOften what
, die eine Liste
erzeugt, die aus howOften
Elementen besteht,
die allesamt gleich what
ist:
repeat 4 "ja"
["ja","ja","ja","ja"] : List String
Übungsaufgabe Schreiben Sie eine Funktion
datesFromTo dayFrom dayTo
die die Liste aller Daten von dayFrom
bis
einschließlich dayTo
erzeugt.
Verwenden Sie hier Date.tomorrow
als
Subroutine!
Übungsaufgabe
Schreiben Sie eine Funktion
isPrime : Int -> Bool
, die berechnet,
ob das Argument eine Primzahl ist. Schreiben Sie dann
eine Funktion
primesFromTo a b
, die die Liste aller
Primzahlen von \(a\) bis \(b\) berechnet.