i

Rekursive Funktionsaufrufe

Analyse von Firmengehältern

Für eine bundesweite Untersuchung von Jahresgehältern mittelständischer Unternehmen stellen einige Firmen ihre Gehaltslisten zur Verfügung. Um diese Listen effektiv analysieren und verarbeiten zu können, wollen wir uns einige Funktionen definieren, die die Arbeit mit den Listen vereinfachen.


Aufgabe 1: Liste automatisiert füllen

Neue Datei - rekursion.rkt

In rein funktionalen Sprachen gibt es keine Schleifenstrukturen wie while oder for. Um unsere gewünschten Funktionen in späteren Aufgaben definieren zu können, benötigen wir daher eine andere Möglichkeit, um die Listen zu durchlaufen: Rekursion.

Um uns mit Rekursion vertraut zu machen, möchten wir eine Funktion zum automatisierten Befüllen einer Liste implementieren. Die Funktion list-fill erhält als Übergabedatum eine Zahl $n \in \mathbb{N}$ und soll eine absteigend sortierte Liste $(list\ n\ ...\ 0)$ produzieren:

> (list-fill 0)
;Erwartete REPL-Ausgabe: #<list 0>

> (list-fill 1)
;Erwartete REPL-Ausgabe: #<list 1 0> 

> (list-fill 2)
;Erwartete REPL-Ausgabe: #<list 2 1 0>

(a) Implementiere die Funktion list-fill so, dass diese erst einmal nur für die Übergabe 0 (also für den Ausdruck (list-fill 0)) eine Liste zurückgibt.

(b) Wir haben nun aus Aufgabenteil (a) eine Funktion, die bei der Übergabe 0 eine Liste (list 0) zurückgibt. Überlege, wie du diese Liste nutzen kannst, um daraus die Rückgabe für den Ausdruck (list-fill 1) zu erzeugen.

(c) Ergänze die Funktion list-fill so, dass diese auch für die Übergabe 1 die korrekte Liste zurückgibt. Nutze zur Erzeugung der Liste den Aufruf (list-fill 0).

(d) Ergänze die Funktion list-fill so, dass diese auch für die Übergabe 2 die korrekte Liste zurückgibt. Nutze zur Erzeugung der Liste den Aufruf (list-fill 1).

(e) Ergänze die Funktion list-fill so, dass diese auch für die Übergabe 3 die korrekte Liste zurückgibt. Nutze zur Erzeugung der Liste den Aufruf (list-fill 2).

(f) Betrachte in deiner Funktion die Fälle für die Übergaben 1 bis 3. Welches Muster fällt dir auf? Verallgemeinere dieses Muster in deiner Funktion zu einem einzelnen Fall für alle Übergaben größer als $0$.

(g) Teste deine Funktion mit den Übergabewerten 5, 12 und 42.


Aufgabe 2: Median-Bestimmung mittels Index

Bestehende Datei - rekursion.rkt

Zur Analyse der Gehälter legt Firma-A eine geordnete Liste mit den Jahresgehältern der 30 Mitarbeitenden vor:

(define firmaA
  (list 21000 28000 28000 34000 34000 35000 35000 38000 38000 38000 38000 38000 38000 50000 50000 50000 50000 50000 50000 50000
        51000 57000 57000 57000 60000 60000 60000 75000 110000 110000))

Da der Medianwert im Gegensatz zum Mittelwert robust gegenüber extremen Ausreißern ist, wird dieser häufig zur Analyse von Gehältern genutzt.

Der Medianwert stellt den in der Mitte liegenden Wert einer geordneten Liste dar. Zum Beispiel der Wert $2$ bei der Liste $(list\ 1\ 2\ 3)$. Wenn es keine eindeutige Mitte gibt (bei einer Liste von gerader Länge), wird der Mittelwert der beiden mittleren Werte berechnet. Zum Beispiel der Wert $2.5$ bei der Liste $(list\ 1\ 2\ 3\ 4)$.

(a) Zur Bestimmung des Medianwerts ist es hilfreich, wenn wir Elemente einer Liste anhand ihres Index selektieren können. Ergänze die fehlenden Segmente (...) in der untenstehenden Funktion.

;Gibt den Wert einer Liste an Index i zurück
(: select-index ((list-of any) natural -> any))
...
(define select-index
  (lambda (l i)
    (cond
     ([> (+ i 1) (length l)] empty) ;Fall: Index nicht in Liste
     ([= i 0] ...)
     (else ...))))  

Hilfestellung für Aufgabenteil (a):
Der Index 2 der Liste (list "Elem0" "Elem1" "Elem2" "Elem3") ist der Index 1 der Teilliste (list "Elem1" "Elem2" "Elem3") und der Index 0 der Teilliste (list "Elem2" "Elem3").

(b) Bestimme den Medianwert der Jahresgehälter von Firma-A. Ob du hierfür eine eigene allgemeine Funktion zur Bestimmung eines Medianwerts schreibst oder einfach einen Ausdruck in die REPL, ist dir überlassen.


Aufgabe 3: Die ersten und letzten n Elemente einer Liste

Bestehende Datei - rekursion.rkt

Ebenfalls interessieren uns Informationen wie: "Die $n$ bestverdienenden Personen haben folgende Gehälter... ". Wir möchten hierzu beispielsweise die letzten oder ersten 10 Einträge einer Liste erhalten.

(a) Implementiere die Funktion takeLast, die die letzten $n$ Elemente einer Liste als Liste zurückgibt

(b) Implementiere die Funktion takeFirst, die die ersten $n$ Elemente einer Liste als Liste zurückgibt

(c) Bestimme die drei höchsten und die fünf geringsten Jahresgehälter in Firma-A.

Tipp: In dieser Aufgabe kann die Implementation von Hilfsfunktionen nützlich sein. Also Funktionen, die du aus deiner Hauptfunktion heraus ausrufst, die notwendige Verarbeitungsschritte zur Problemlösung vornehmen.

Tipp: Mit der Funktion reverse lassen sich Listen in Racket invertieren. Diese Funktion kann für diese Aufgabe nützlich sein, ist jedoch nicht zwingend notwendig.

Suche

v
100.137.4.1.1 Rekursive Funktionsaufrufe
Kopieren durch Anklicken

Rückmeldung geben