Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Funktionale Programmierung mit Scheme: Listen glätten, multiplizieren und Überschneidungen finden – Ein Leitfaden für CMPSC 461

Lerne, wie du in Scheme Listen glättest, multiplizierst und Überschneidungen findest. Perfekt für dein CMPSC 461 Projekt – mit aktuellen Beispielen aus KI und Gaming.

Scheme Programmierung CMPSC 461 Listen glätten Scheme Listen multiplizieren Scheme overlap Funktion Scheme list-tail implementieren list-ref implementieren assoc Scheme funktionale Programmierung lernen Dr. Racket Tutorial Projekt 2 Lösung Datenstrukturen Scheme KI Algorithmen Scheme Gaming Datenverarbeitung Studenten Hilfe Scheme Programmierung Konzepte

Einführung in die funktionale Programmierung mit Scheme

Scheme ist eine der bekanntesten Sprachen der funktionalen Programmierung und ein zentraler Bestandteil des Kurses CMPSC 461 Programming Languages Concepts. In diesem Tutorial lernst du, wie du mit Scheme Listen manipulierst, sie glättest, multiplizierst und gemeinsame Elemente findest. Diese Konzepte sind nicht nur für dein Projekt wichtig, sondern auch für aktuelle Trends wie KI-Algorithmen und Datenverarbeitung in Apps. Stell dir vor, du entwickelst eine Empfehlungs-Engine wie bei Netflix – du musst Daten aus verschiedenen Quellen kombinieren und filtern. Genau das übst du hier.

1. Funktionen schreiben in Dr. Racket

Bevor wir loslegen, stelle sicher, dass du Dr. Racket installiert hast. Öffne das Programm und beginne mit einer neuen Datei. Wir werden Schritt für Schritt vorgehen.

1.1 Eine Funktion zum Glätten einer Liste: smooth

Das Glätten einer Liste bedeutet, dass alle Unterlisten entfernt werden und nur eine flache Liste übrig bleibt. Zum Beispiel: (smooth '(1 (2 3) (4 (5 6)))) ergibt (1 2 3 4 5 6). Dies ist nützlich, wenn du Daten aus verschachtelten JSON-Objekten extrahierst, wie sie in modernen APIs vorkommen.

(define (smooth lst)
  (cond
    [(null? lst) '()]
    [(pair? (car lst)) (append (smooth (car lst)) (smooth (cdr lst)))]
    [else (cons (car lst) (smooth (cdr lst)))]))

Diese Funktion prüft, ob das erste Element eine Liste ist. Wenn ja, wird es rekursiv geglättet und mit dem Rest der Liste verbunden. Sonst wird das Element einfach hinzugefügt.

1.2 Eine Funktion zur Überprüfung eines Prädikats

Oft musst du testen, ob ein Element eine bestimmte Eigenschaft erfüllt. Zum Beispiel: Ist die Liste leer? Ist ein Element eine Zahl? Hier ein Beispiel für eine Funktion, die prüft, ob ein Element eine Liste ist:

(define (is-list? x)
  (pair? x))

Diese einfache Funktion nutzt das eingebaute pair?, um zu testen, ob x ein Paar und damit eine Liste ist.

2. Listen multiplizieren: multiply

Die multiply-Funktion soll zwei Listen elementweise multiplizieren. Aber Vorsicht: Die Listen können leer, einfach oder verschachtelt sein. Wenn eine Liste leer ist, ist das Ergebnis leer. Hier ein Beispiel:

(multiply '(1 2 3) '(4 5 6)) = (4 10 18)

Für verschachtelte Listen müssen wir rekursiv vorgehen:

(define (multiply lst1 lst2)
  (cond
    [(or (null? lst1) (null? lst2)) '()]
    [(and (pair? (car lst1)) (pair? (car lst2)))
     (cons (multiply (car lst1) (car lst2))
           (multiply (cdr lst1) (cdr lst2)))]
    [(or (pair? (car lst1)) (pair? (car lst2)))
     (error "Inkompatible Typen")]
    [else (cons (* (car lst1) (car lst2))
                (multiply (cdr lst1) (cdr lst2)))]))

Diese Funktion behandelt alle Fälle: leere Listen, einfache Zahlen und verschachtelte Listen. Stell dir vor, du kombinierst Spielerstatistiken aus zwei verschiedenen Gaming-Plattformen – du musst die Werte paarweise multiplizieren, um eine kombinierte Punktzahl zu erhalten.

3. Gemeinsame Elemente finden: overlap

Die overlap-Funktion nimmt zwei sortierte Listen und gibt die Werte zurück, die in beiden vorkommen. Zum Beispiel: (overlap '(1 2 2 3 7) '(2 3 8)) ergibt (2 3). Dies ist vergleichbar mit der Schnittmengenbildung in Datenbanken oder bei KI-Recommendation-Systemen.

(define (overlap lst1 lst2)
  (cond
    [(or (null? lst1) (null? lst2)) '()]
    [(= (car lst1) (car lst2))
     (cons (car lst1) (overlap (cdr lst1) (cdr lst2)))]
    [(< (car lst1) (car lst2))
     (overlap (cdr lst1) lst2)]
    [else
     (overlap lst1 (cdr lst2))]))

Da die Listen sortiert sind, können wir sie parallel durchlaufen. Bei Gleichheit fügen wir das Element hinzu, ansonsten bewegen wir uns in der Liste mit dem kleineren Element weiter.

4. Eigene Implementierungen von list-tail und list-ref

Scheme bietet zwar diese Funktionen, aber es ist lehrreich, sie selbst zu schreiben.

4.1 list-tail

list-tail gibt die Teilliste ab einer bestimmten Position zurück. Zum Beispiel: (list-tail '(a b c d) 2) ergibt (c d).

(define (my-list-tail lst k)
  (if (= k 0)
      lst
      (my-list-tail (cdr lst) (- k 1))))

4.2 list-ref

list-ref gibt das Element an einer bestimmten Position zurück. Zum Beispiel: (list-ref '(a b c d) 2) ergibt c.

(define (my-list-ref lst k)
  (if (= k 0)
      (car lst)
      (my-list-ref (cdr lst) (- k 1))))

Diese Funktionen sind grundlegend für den Zugriff auf Datenstrukturen, ähnlich wie Indizes in Arrays in anderen Sprachen.

5. Assoziationslisten: assoc

Eine Assoziationsliste ist eine Liste von Schlüssel-Wert-Paaren. Die assoc-Funktion sucht den ersten Eintrag mit einem bestimmten Schlüssel. Hier ein Beispiel:

(define e '((a 1) (b 2) (c 3)))
(assoc 'a e) = (a 1)

Du kannst assoc nutzen, um Konfigurationen oder Benutzerdaten in einer App zu speichern. Stell dir vor, du hast eine Liste von Spielern und ihren Highscores – mit assoc findest du schnell den Score eines bestimmten Spielers.

(define (my-assoc key lst)
  (cond
    [(null? lst) #f]
    [(equal? key (caar lst)) (car lst)]
    [else (my-assoc key (cdr lst))]))

Beachte, dass equal? verwendet wird, um auch Listen als Schlüssel zu vergleichen.

Fazit

Mit diesen Funktionen hast du die Grundlagen der Listenverarbeitung in Scheme gemeistert. Sie sind nicht nur für dein CMPSC 461 Projekt relevant, sondern auch für viele reale Anwendungen – von der Datenanalyse in KI bis zur Entwicklung von Apps. Übe weiter, indem du eigene Beispiele ausprobierst, etwa mit aktuellen Spiele-Ergebnissen oder Finanzdaten. Viel Erfolg!