Listen
In Scheme ist eine Liste eine grundlegende Datenstruktur, die zum Gruppieren von Werten verwendet wird. Listen sind geordnete Sammlungen von Elementen, wobei jedes Element einen beliebigen Typ haben kann, einschließlich einer anderen Liste. Listen werden in Scheme häufig sowohl zur Datenspeicherung als auch zur Programmstruktur verwendet.
Beispiel 1: Einfache Liste
(list 1 2 3)- Erstellt eine Liste mit drei Elementen:
1,2und3.
Ergebnis: (1 2 3)
Zugriff auf Listenelemente
Auf Elemente in einer Liste wird mit den Prozeduren car und cdr zugegriffen:
carruft das erste Element einer Liste ab.cdrruft den Rest der Liste ab (alles außer dem ersten Element).
Beispiele
(define my-list (list 1 2 3))
(car my-list) ; Retrieves the first element
(cdr my-list) ; Retrieves the rest of the listErgebnis:
(car my-list)gibt1zurück(cdr my-list)gibt(2 3)zurück
Einfache Rekursion: Durch eine Liste iterieren
Durch den rekursiven Aufruf von car auf dem cdr einer Liste können Sie jedes Element einzeln verarbeiten, bis die Liste durchlaufen ist. Dies bildet die Grundlage vieler Listenverarbeitungsalgorithmen.
Beispiel: Jedes Element einer Liste drucken
Hier ist eine einfache rekursive Funktion zum Drucken jedes Elements in einer Liste:
(define (print-elements lst)
(if (null? lst)
(lumi-message "done")
(begin
(lumi-message (number->string (car lst))) ;; Print the first element
(print-elements (cdr lst))))) ;; Process the rest of the list- Basisfall: Wenn die Liste leer ist (
null? lst), stoppen Sie die Rekursion. - Rekursiver Fall: Drucken Sie das erste Element (
car lst) und rufen Sie dann die Funktion für den Rest der Liste auf (cdr lst).
Beispielverwendung
(print-elements (list 1 2 3))Ausgabe:
"1""2""3"
Ergebnis: „erledigt“
Wie es funktioniert
- Die Funktion ruft mit
cardas erste Element der Liste ab und verarbeitet es. - Anschließend ruft es sich selbst mit dem Rest der Liste auf (
cdr). - Dieser Vorgang wiederholt sich, bis die Liste leer ist (
null? lst).
Beispiel 2: Gemischte Typen
Listen können Elemente unterschiedlichen Typs enthalten, darunter Zeichenfolgen, boolesche Werte, Zahlen, andere Listen oder sogar das Ergebnis von Ausdrücken:
(list 42 "hello" #t (list 1 2) (+ 3 4))- Dadurch wird eine Liste erstellt mit:
- Eine Zahl (
42) - Eine Zeichenfolge (
"hello") – Ein boolescher Wert (#t) - Eine weitere Liste (
(1 2)) – Das Ergebnis eines Ausdrucks ((+ 3 4), der zu7ausgewertet wird)
- Eine Zahl (
Ergebnis: (42 "hello" #t (1 2) 7)
Diese Beispiele veranschaulichen die Vielseitigkeit von Listen in Scheme und machen sie zu einem leistungsstarken Werkzeug zum Organisieren und Bearbeiten von Daten.
Listen erstellen
Die Prozedur cons wird verwendet, um eine neue Liste zu erstellen, indem ein Element mit einer vorhandenen Liste kombiniert wird.
(cons new-element existing-list)Beispiel
(cons 0 (list 1 2 3))- Fügt
0am Anfang der Liste(1 2 3)hinzu.
Ergebnis: (0 1 2 3)
Nach Listen suchen
Die Prozedur list? prüft, ob ein gegebener Wert eine Liste ist.
(list? value)Beispiel: Liste?
(list? (list 1 2 3)) ; Checks if (list 1 2 3) is a list
(list? 42) ; Checks if 42 is a listErgebnis:
(list? (list 1 2 3))gibt#tzurück (wahr)(list? 42)gibt#fzurück (falsch)
Operationen auf Listen
Scheme bietet mehrere integrierte Verfahren zum Arbeiten mit Listen, darunter:
length: Gibt die Anzahl der Elemente in einer Liste zurück.append: Kombiniert zwei oder mehr Listen zu einer.reverse: Gibt eine neue Liste mit Elementen in umgekehrter Reihenfolge zurück.
(length (list 1 2 3)) ; Returns 3
(append (list 1 2) (list 3 4)) ; Returns (1 2 3 4)
(reverse (list 1 2 3)) ; Returns (3 2 1)Ergebnis:
(length (list 1 2 3))gibt3zurück(append (list 1 2) (list 3 4))gibt(1 2 3 4)zurück(reverse (list 1 2 3))gibt(3 2 1)zurück#### Verwendung vonlist-ref
Die Prozedur list-ref ruft das Element an einem angegebenen Index einer Liste ab (nullbasierter Index).
(list-ref lst index)lst: Die Liste, aus der das Element abgerufen werden soll.index: Ein nullbasierter Index, der angibt, welches Element zurückgegeben werden soll.
Beispiel: Listenreferenz
(list-ref (list 10 20 30 40) 2) ; Retrieves the element at index 2Ergebnis: 30
Verschachtelte Listen
Listen in Scheme können andere Listen als Elemente enthalten, wodurch eine verschachtelte Struktur entsteht.
Beispiel: Erstellen einer verschachtelten Liste
(define nested-list (list (list 1 2) (list 3 4) (list 5)))- Erstellt eine Liste mit drei Elementen, von denen jedes selbst eine Liste ist.
Ergebnis: ((1 2) (3 4) (5))
Zugriff auf verschachtelte Daten
Um auf Elemente innerhalb einer verschachtelten Liste zuzugreifen, können Sie Kombinationen aus car und cdr verwenden, um durch die Struktur zu navigieren.
Beispiel: Auf Elemente zugreifen
(car nested-list) ; Retrieves the first element: (1 2)
(car (car nested-list)) ; Retrieves the first element of the first sublist: 1
(cdr (car nested-list)) ; Retrieves the rest of the first sublist: (2)
(car (cdr (car nested-list))) ; Retrieves the second element of the first sublist: 2Erklärung
car nested-list: – Ruft das erste Element vonnested-listab, nämlich(1 2).car (car nested-list): – Ruft das erste Element von(1 2)ab, nämlich1.cdr (car nested-list): – Ruft den Rest von(1 2)ab, also(2).car (cdr (car nested-list)): – Ruft das erste Element von(2)ab, nämlich2.
Beispiel: Zugriff auf Elemente aus anderen Unterlisten
(car (cdr nested-list)) ; Retrieves the second sublist: (3 4)
(car (car (cdr nested-list))) ; Retrieves the first element of the second sublist: 3Dieser Ansatz ermöglicht Ihnen die systematische Navigation und den Zugriff auf bestimmte Elemente in einer verschachtelten Liste und bietet so eine leistungsstarke Flexibilität für die Arbeit mit hierarchischen Daten.
Zusammenfassung
- Listen in Scheme sind vielseitige und wesentliche Datenstrukturen.
- Verwenden Sie
listzum Erstellen einer Liste,carundcdrfür den Zugriff auf Elemente undconszum Erstellen von Listen. - Integrierte Prozeduren wie
length,append,reverseundlist-refmachen Listenoperationen einfach und effizient. - Listen können verschachtelt werden, was komplexe Datenstrukturen für erweiterte Anwendungsfälle ermöglicht.