i

Multiparadigmatische Nutzung von Programmierparadigmen

Rekursion und Schleifenstrukturen

In imperativen Programmen ist die Nutzung von Schleifenstrukturen wie while und for ein gängiges Programmierkonzept. Zum Beispiel zur Bestimmung der Fakultät:


#Python
def fakultaet(n):
    ergebnis = 1
    while(n>0):
        ergebnis = ergebnis * n
        n = n-1
    return ergebnis
In funktionalen Programmen sind diese Programmierkonzepte jedoch nicht möglich. Anstelle dieser verwendet man Rekursion.

Aufgabe 1: Rekursion

Bestehende Datei - funktional_imperativ.rkt
Bestehende Datei - funktional_imperativ.py

(a) Ergänze den fehlenden Racket-Code ... zur Erstellung einer rekursiven Fakultätsberechnung.


;Racket
(define fakultaet
  (lambda (n)
    (if [= n 0]
        1
        ...)))

Rekursion ist jedoch kein Alleinstellungsmerkmal funktionaler Sprachen, sondern kann in imperativen Sprachen analog verwendet werden.

(b) Schreibe in dein Python-Programm eine Funktion fakultaetRek, die die Fakultätsberechnung rekursiv durchführt.

Funktionen höherer Ordnung und Anonyme Funktionen

Ein weiteres wichtiges Programmierkonzept der funktionalen Programmierung stellen Funktionen höherer Ordnung dar. Also all die Funktionen, die Funktionen als Übergabedaten erhalten oder als Rückgabedaten liefern.

Das funktionale Konzept, Funktionen wie andere Daten zu behandeln und sie entsprechend als Werte übergeben oder zurückgeben zu können, ist so mächtig und praktisch, dass es inzwischen auch in viele imperative Programmiersprachen integriert wurde.

Aufgabe 2: Funktionen höherer Ordnung in Python

Bestehende Datei - funktional_imperativ.py

(a) Überlege, welche Ausgabe das untenstehende Python-Programm produziert und überprüfe deine Vermutung.


#Python
def erhoehe(x):
    return x + 1

def wendeAn(f,x):
    return f(x)

y = wendeAn(erhoehe,2)
print(y)

(b) Insbesondere Listenfunktionen wie map und filter finden sich explizit in vielen imperativen Sprachen wieder. Überlege, welche Ausgabe die untenstehende Python-Zeile produzieren und überprüfe deine Vermutung.


#Python
zahlen = [1, 2, 3, 4]
print( list(map(erhoehe, zahlen)) )

Zur Nutzung der Listenfunktionen haben wir in Racket häufig anonyme Funktionen übergeben, zum Beispiel:


;Racket
(define zahlen (list 1 2 3 4))
(filter (lambda (x) (< x 3)) zahlen)
Auch das ist mittlerweile in Python möglich:

#Python
zahlen = [1, 2, 3, 4]
print( list(filter(lambda x: x < 3, zahlen)) )

(c) Schreibe eine Python-Zeile, die dir in einer Zahlenliste jeden Wert um zwei verringert.

Records vs. Klassen und Objekte

Zur Strukturierung von imperativen Programmen kommen häufig Klassen und Objekte zum Einsatz. Betrachtet man beispielsweise die Klasse Schuelerin in Python:


#Python
class Schuelerin:
    def __init__(self, name, jgs, noten):
        self.name = name
        self.jgs = jgs
        self.noten = noten #Liste

    def durchschnitt(self):
        if len(self.noten)==0:
            return 0
        return sum(self.noten) / len(self.noten)
Die Klasse besitzt mit name, jgs und noten drei veränderbare Attribute und mit durchschnitt eine Methode, mit welcher der Notendurchschnitt der im Attribut noten gespeicherten Liste berechnet werden kann.

Eine beispielhafte Verwendung der Klasse in Form des Objekts lea lässt sich wie folgt umsetzen:


#Python
lea = Schuelerin("Lea", 12, [13, 3, 11, 9, 8])
print(lea.durchschnitt())

Aufgabe 3: Records

Bestehende Datei - funktional_imperativ.rkt

Im funktionalen Programmierparadigma finden sich keine Klassen und Objekte. Um Daten zu strukturieren und zusammenzusetzen können hier Records genutzt werden:


;Racket
(define-record schuelerin
  make-schuelerin
  (schuelerin-name string)
  (schuelerin-jgs natural)
  (schuelerin-note (list-of natural)))


(define lea (make-schuelerin "Lea" 12 (list 13 3 11 9 8)))

Records bieten im Gegensatz zu Klassen keine Möglichkeit, Methoden zu integrieren. Um die Daten der Records zu verarbeiten, müssen entsprechend Funktionen genutzt werden.

(a) Schreibe eine Funktion durchschnitt-schuelerin, die den Durchschnitt eines übergebenen schuelerin-Records zurückgibt.

Multiparadigmatische Programmiersprachen

Wie du gesehen hast, kann man viele funktionale Konzepte auch in Python umsetzen. Tatsächlich ist es möglich, mit Python komplett funktional zu programmieren. Indem man unter anderem gänzlich auf die Nutzung von veränderbaren Variablen verzichtet. Wie das im Detail funktioniert, kannst du dir in diesem inf-schule-Kapitel anschauen. Man nennt Python daher auch eine multiparadigmatische Sprache, da mit dieser verschiedene Programmierparadigmen genutzt werden können.

Die von uns in diesem Kapitel verwendete Racket-Version erlaubt zwar nur funktionale Konzepte, es gibt jedoch auch Racket-Versionen, die ebenfalls multiparadigmatisch sind. So kann man in diesen beispielsweise mit dem Operator set! Definitionen verändern oder auch Klassen und Objekte erstellen.

Suche

v
100.137.6.1.1.3 Multiparadigmatische Nutzung von Programmierparadigmen
Kopieren durch Anklicken

Rückmeldung geben