Prozeduren höherer Ordnung

Aus ProgrammingWiki
Archivierte Version vom 2009-05-11T14:12:52+00:00. Aktuelle Version

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>