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>(filter '(1 2 3 4 5 6 7 8 9) even?)</eval>
Tabellieren
Schreiben Sie eine Prozedur tabelliere zur Ausgabe einer Wertetabelle einer einstelligen Funktion f von a bis b. 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>(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>((compose (lambda (n) (+ n n)) (lambda (n) (* n n))) 4)</eval>
̈filter In
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> (filter-in ’(nliste 1000))</eval>
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> (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> (filter-out ’(nliste 1000))</eval>