Prozeduren höherer Ordnung
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)
<eval id="4af4362300acb">(filter '(1 2 3 4 5 6 7 8 9) even?)</eval>
Tabellieren
Schreiben Sie eine Prozedur tabelliere zur Ausgabe einer Wertetabelle mit den Spalten x und f(x), wobei f eine einstellige Funktion ist, die für x=a,a+1,\ldots,b protokolliert werden soll. f, a und b sollen beim Aufruf als Parameter übergeben werden.
Hinweis: Testen Sie auch mit Lambda-Ausdrücken für f.
Aufrufbeispiel
> (tabelliere (lambda (x) (* x x)) 0 5) (0 1 4 9 16 25)
<eval id="4af43623012b8">(tabelliere (lambda (x) (* x x)) 0 5)</eval>
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!
Tipp: Das Aufrufbeispiel funktioniert folgendermaßen: Der Wert 4 wird der ersten Prozedur und dessen Ergebnis danach an die zweite Prozedur ubergeben.
<eval id="4af4362301a70">((compose (lambda (n) (+ n n)) (lambda (n) (* n n))) 4)</eval>
̈Primzahlen
Schreiben Sie eine Prozedur filter-in, die aus der Liste der natürlichen Zahlen von 1 bis 1000 alle Primzahlen herausfiltert und als Liste zurückgibt.
Natürliche Zahlen
Sie benötigen eine Hilfsprozedur nliste, die eine Liste mit natürlichen Zahlen von 1 bis n erzeugt.
Aufrufbeispiele
> (nliste 5) (1 2 3 4 5)
<eval id="4af43623022e5">(nliste 1000)</eval>
Filter-In
Nun die Liste der Primzahlen, versuchen sie dabei die vorher erstellten Prozeduren zu benutzen
Aufrufbeispiele
(filter-in '(nliste 1000)) >(2 3 5 7 11 13 17 19 ...)
<eval id="4af4362302a67"> (filter-in '(nliste 1000))</eval>
Filter-Out
Schreiben Sie analog zu filter-in eine Prozedur filter-out, die statt der Liste mit Primzahlen die Restliste ohne Primzahlen liefert. Aufrufbeispiele
> (filter-out '(nliste 1000)) (1 4 6 8 9 10 12 14 15 ...)
<eval id="4af43623031d9"> (filter-out '(nliste 1000))</eval>