Prozeduren höherer Ordnung-Loesung
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)
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)
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!
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 n 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 ...)
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 ...)