Prozeduren höherer Ordnung
Aus ProgrammingWiki

Inhaltsverzeichnis |
Filter
Schreiben Sie eine Prozedur filter, die eine Liste und eine Filterprozedur nimmt, und eine "gefilterte" Liste zurückgibt.
Hinweis: Die Filterprozedur ist eine einstellige Prozedur, welche #t bzw. #f zurückgibt.
Aufrufbeispiele
>(filter '(1 2 3 4 5 6 7 8 9) even?) (2 4 6 8) >(filter '(1 2 3 4 5) (lambda (x) (not (or (= x 2) (= x 5))))) (1 3 4) >(filter '(#\a 276 "blubb" 5 blah 3 5 (4 995 54)) number?) (276 5 3 5)
Quelltext überprüfen:
Tabellieren
Schreiben Sie eine Prozedur tabelliere zur Ausgabe einer Wertetabelle mit den Spalten und
, wobei
eine einstellige Funktion ist, die für
protokolliert werden soll.
,
und
sollen beim Aufruf als Parameter übergeben werden.
Hinweis: Testen Sie auch mit Lambda-Ausdrücken für .
Aufrufbeispiel:
> (tabelliere (lambda (x) (* x x)) 0 5) (0 1 4 9 16 25)
Quelltext überprüfen:
Compose
Schreiben Sie eine Prozedur compose, die zwei einstellige Prozeduren proc1 und proc2 nimmt, diese verkettet und die Verkettungsprozedur "proc2 nach proc1" zurückgibt. Wenden Sie compose auf geeignete Argumente an.
Aufrufbeispiel:
> ((compose (lambda (n) (+ n n)) (lambda (n) (* n n))) 4) 64
Wichtig: Die Klammersetzung im Aufrufbeispiel ist korrekt!
Quelltext überprüfen:
Primzahlen
Verwenden Sie die oben definierte Prozedur filter, um aus der Liste der natürlichen Zahlen von 1 bis 1000 alle Primzahlen herauszusieben. Die verbleibenden Primzahlen sollen als Liste zurückgegeben werden.
Natürliche Zahlen
Sie benötigen eine Hilfsprozedur nliste, die eine Liste mit natürlichen Zahlen von 1 bis n erzeugt.
Aufrufbeispiel:
> (nliste 5) (1 2 3 4 5)
Außerdem benötigen Sie eine Prozedur prim?, die für eine gegebene natürliche Zahl feststellt, ob sie eine Primzahl ist oder nicht. Verwenden Sie die folgende Prozedur alle-teiler zur Definition von prim?.
Beachten Sie, dass die Prozedur alle-teiler die Zahl 1 nicht enthält. Mathematisch ist 1 Teiler jeder Zahl.
Nun kann die Liste der Primzahlen berechnet werden:
Aufrufbeispiel:
(filter (nliste 1000) prim?) >(2 3 5 7 11 13 17 19 ...)
Quelltext überprüfen:
Filter-Out
Schreiben Sie analog zu filter eine Prozedur filter-out, die statt der Liste mit Primzahlen die Restliste ohne Primzahlen liefert. Die Primzahlen werden sozusagen herausgefiltert und aus der Ursprungsliste entfernt.
Aufrufbeispiel:
> (filter-out (nliste 1000) prim?) (1 4 6 8 9 10 12 14 15 ...)
Quelltext überprüfen: