Prozeduren höherer Ordnung (I)

Aus ProgrammingWiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Prozeduren nehmen Prozeduren entgegen

Wir betrachten folgende zweistellige Prozeduren:

Zweistellige Prozeduren höherer Ordnung

Die Prozeduren unterscheiden sich nur durch die Verwendung des Operators. Wir entwickeln deshalb eine (zunächst) zweistellige Universalprozedur:

Die Prozedur verarbeiten2 nimmt neben den beiden Operanden x und y einen Operator bzw. eine Prozedur entgegen.
Sie ist damit eine Prozedur höherer Ordnung.
Prozeduren höherer Ordnung nehmen Prozeduren als Argumente entgegen oder geben Prozeduren als Funktionswerte zurück.

Hoeher1.GIF

Gegeben sei die zweistellige Prozedur:

Wir testen unsere Universalprozedur:

Variabelstellige Prozeduren höherer Ordnung

Es ist bekannt, dass die Standard-Prozeduren +, -, * und / variabelstellige Prozeduren sind, die eine beliebige Anzahl von Operanden entgegen nehmen können, mindestens aber einen Operanden benötigen.
Wir generalisieren deshalb unsere Universalprozedur zur variabelstelligen Prozedur verarbeiten:

Aus der Syntax der Prozedurdefinition ist erkennbar, dass die Argumente op und x zwingend erforderlich sind, während alle weiteren Parameter zu einer Liste zusammengefasst werden. Diese Liste kann durchaus leer sein.
Beachte: In dieser Implementation muss aber der Operator quotiert übergeben werden.
Die Nacheinanderausführung von cons und eval wird deshalb mit der Prozedur apply zusammengefasst:

bzw.

Im Gegensatz zur ersten Definition wird hier der Operator nicht quotiert, so dass verarbeiten wieder eine "echte" Prozedur höherer Ordnung ist.
Nun können wir auch die Maximum-Prozedur zu einer variabelstelligen Prozedur erweitern:

Ergänzen Sie die Hilfsprozedur max-help, mit der aus dem Argument x sowie einer weiteren Zahlenliste ls das Maximum zurückgegeben werden soll.

 

Quelltext überprüfen:

Die Prozedur map

Testen Sie die Standard-Prozedur map an verschiedenen Beispielen:

Beschreiben Sie die Signatur dieser Prozedur.
Begründen Sie, warum map eine Prozedur höherer Ordnung ist.
Bilden Sie nun diese Standard-Prozedur mit der benutzerdefinierten Prozedur my-map nach.

 

Quelltext überprüfen:

Wir definieren die Bildungsvorschrift ungerader Zahlen und wenden sie mit my-map an:

Es muss klar sein, dass auch unbenannte Prozeduren übergeben werden können:

Aufgaben

  1. Entwickeln Sie eine Prozedur höherer Ordnung, mit der die 3. Potenzen (Kubikzahlen) aller Elemente einer numerischen Liste berechnet werden können.

  2. Entwickeln Sie die Prozedur (my-filter <proz> <ls>), mit der Elemente mit bestimmten Eigenschaften aus einer Zahlenliste herausgefiltert werden können.
    Testen Sie diese Prozedur mit dem Prädikat gerade?, z.B.:
    (my-filter gerade? '(1 2 3 4 5 6 7 8 9 10))
    --> (2 4 6 8 10)
    

    Hinweis: Mit der Prozedur modulo kann der Rest einer ganzzahligen Division ermittelt werden:

    (modulo 7 3)  --> 1
    (modulo 12 2) --> 0
    

     

    Quelltext überprüfen:

Zum Weiterarbeiten

Primzahlfilter

Mit einem Prädikat primzahl?, das zu einer natürlichen Zahl entscheidet, ob sie eine Primzahl ist, könnte die Prozedur my-filter aus einer Liste beliebiger natürlicher Zahlen alle Primzahlen herausfiltern.
Setzen Sie diese Idee um!

Zur Problemlösung.

Persönliche Werkzeuge