Funktionale Programmierung SS 2013 - Aufgabenblatt 1
Prof. Dr. U. KastensInstitut für Informatik, Fakultät für Elektrotechnik, Informatik und Mathematik, Universität Paderborn
15.04.2013
Praktische Hinweise
In der heutigen Übung verwenden wir das Lisp-System clisp.
Wenn Sie clisp ohne Parameter aufrufen, wird der interaktive Modus gestartet,
den Sie durch die Tastenkombination <STRG>-d
wieder verlassen können.
Lisp arbeitet dann in der sog. read-eval-print-Schleife:
- lies die Eingabe
- werte sie aus
- gib den Ergebniswert aus
Um Ihre Lösungen aufzuheben, empfiehlt es sich, daneben einen Editor (z.B. kate oder gedit) geöffnet zu halten und korrekte Lisp-Programme durch Copy-and-Paste mit der Maus (Kopieren linke Taste, Einfügen mittlere Taste) in den Editor zu übertragen.
Eine so entstehende Lisp-Datei kann dem Lisp-System als Kommandozeilen-Parameter zur nicht-interaktiven Auswertung übergeben werden. In diesem Modus entfällt allerdings die dritte Phase der read-eval-print-Schleife, die automatische Ausgabe der Ergebniswerte. Stattdessen können Sie die Funktion "print" verwenden, um Ergebniswerte auszugeben.
Bsp.:
(print (* 1 2 3 4))
Aufgabe 1 (Erste Schritte mit Lisp)
Starten Sie den CLISP Interpreter in einem Terminal-Fenster und öffnen Sie einen Texteditor.
Entwickeln Sie die Lösungen interaktiv und übertragen Sie sie dann mit Hilfe des Editors in eine Datei
a1.lisp
.
Eine Übersicht der Grundfunktionen in Lisp steht auf Folie 202.
- a)
- Schreiben Sie einen Lisp Ausdruck, der die Zahlen 13 und -12 addiert.
- b)
- Schreiben Sie einen Lisp Ausdruck, der 5*(1+2)-16 berechnet. Formen Sie den Ausdruck dabei nicht algebraisch um.
- c)
-
Binden Sie den Ausdruck 2*3*4 an die Variable
sinn
. Hinweis: Sie können den arithmetischen Operatoren auch mehr als zwei Parameter übergeben. - d)
-
Erzeugen Sie eine Liste, die die Zahlen 1 und 2 enthält.
Benutzen Sie dazu den Listenkonstruktor
cons
und die leere ListeNIL
. - e)
-
Binden Sie eine Liste, die die Zahlen von 1 bis 4 enthält an eine Variable
mylist
. Benutzen Sie dazu diequote
Funktion oder die Kurznotation'( )
. - f)
-
Definieren Sie eine Funktion
avg(x,y)
, die den Durchschnitt vona
undb
berechnet. Rufen Sie die Funktion mit den Werten 2 und 4, sowie 10 und 15 auf. - g)
-
Definieren Sie eine Funktion
sign(x)
, die -1 liefert, wennx
negativ ist, 1 wennx
positiv ist und 0 wennx
gleich 0 ist. Für die Fallunterscheidung benötigen Sie die Funktioncond
.
Aufgabe 2 (Rekursive Funktionen in Lisp)
- a)
-
Schreiben Sie eine Funktion
sum(n)
, die die Summe der Zahlen von 0 bis n berechnet. Gehen Sie davon aus, dass n eine natürliche Zahl ∈ {0,1,2,...} ist. - b)
-
Schreiben Sie eine Funktion
pow(b,e)
, die be rekursiv berechnet. Gehen Sie davon aus, dass e eine natürliche Zahl ∈ {0,1,2,...} ist.
Aufgabe 3 (Funktionen auf Listen)
- a)
-
Die eingebaute Funktion
nth
liefert das n-te Element einer Liste (Zählung beginnt bei 0). Hier sind Beispiel-Ausdrücke:(nth 0 '(hallo welt !)) (nth 1 '(hallo welt !)) (nth 2 '(hallo welt !)) (nth 3 '(hallo welt !))
Schreiben Sie die Funktionntes
, die sich genauso verhält. - b)
-
Die eingebaute Funktion
append
hängt zwei Listen aneinander. Hier ist ein Beispiel-Aufruf:(append '(a b c) '(d e))
Schreiben Sie die Funktionmyappend
, die sich genauso verhält.
Aufgabe 4 (Funktionen höherer Ordnung)
- a)
-
Definieren Sie die Funktion
twice(f x)
, die die Funktionf
"zweimal" auf das Argumentx
anwendet.Bsp.:
(twice (lambda (x)(* x x)) 2)
ergibt 16.Hinweis: Verwenden Sie
funcall
, um eine Funktion aufzurufen, die als Parameter übergeben wird, siehe Folie 204. - b)
-
Neben der Funktion cond für allgemeine Fallunterscheidungen, gibt es in Lisp eine
Funktion if für Unterscheidungen mit zwei Zweigen. Recherchieren Sie, wie if
verwendet wird und schreiben Sie
damit die
map
-Funktion von Folie 204. Nennen Sie siemymap
, da der Namemap
in clisp schon definiert ist.Verwenden Sie
mymap
, um- alle Elemente einer Liste von Zahlen um 1 zu erhöhen.
- alle negativen Elemente einer Liste durch 0 zu ersetzen.
- jedes Element durch eine einelementige Liste zu ersetzen, die dieses Element enthält.
Diese 3 Aufgabenbeschreibungen für mymap sind recht salopp formuliert: gut verständlich aber im funktionalen Umfeld nicht korrekt. Versuchen Sie, die Aufgaben präzise zu formulieren.
Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 29.04.2013