Daftar
Dalam Scheme, daftar adalah struktur data mendasar yang digunakan untuk mengelompokkan nilai. Daftar adalah kumpulan elemen yang diurutkan di mana setiap elemen dapat bertipe apa pun, termasuk daftar lainnya. Daftar banyak digunakan dalam Scheme untuk penyimpanan data dan struktur program.
Contoh 1: Daftar Sederhana
(list 1 2 3)- Membuat daftar tiga elemen:
1,2, dan3.
Hasil: (1 2 3)
Mengakses Elemen Daftar
Elemen dalam daftar diakses menggunakan prosedur car dan cdr:
carmengambil elemen pertama dari daftar.cdrmengambil sisa daftar (semuanya kecuali elemen pertama).
Contoh
(define my-list (list 1 2 3))
(car my-list) ; Mengambil elemen pertama
(cdr my-list) ; Mengambil sisa daftarHasil:
(car my-list)kembali1(cdr my-list)kembali(2 3)
Rekursi Sederhana: Iterasi Melalui Daftar
Dengan memanggil car pada cdr daftar secara rekursif, Anda dapat memproses setiap elemen satu per satu hingga daftar tersebut dilintasi. Ini membentuk dasar dari banyak algoritma pemrosesan daftar.
Contoh: Mencetak Setiap Elemen Daftar
Berikut fungsi rekursif sederhana untuk mencetak setiap elemen dalam daftar:
(define (print-elements lst)
(if (null? lst)
(lumi-message "done")
(begin
(lumi-message (number->string (car lst))) ;; Mencetak elemen pertama
(print-elements (cdr lst))))) ;; Memproses sisa daftar- Kasus Dasar: Jika daftar kosong (
null? lst), hentikan rekursi. - Kasus Rekursif: Cetak elemen pertama (
car lst), lalu panggil fungsi di daftar lainnya (cdr lst).
Contoh Penggunaan
(print-elements (list 1 2 3))Keluaran:
"1""2""3"
Hasil: “selesai”
Cara Kerjanya
- Fungsi ini mengambil elemen pertama dari daftar menggunakan
cardan memprosesnya. - Kemudian memanggil dirinya sendiri dengan daftar lainnya (
cdr). - Proses ini berulang hingga daftar kosong (
null? lst).
Contoh 2: Tipe Campuran
Daftar dapat menyertakan elemen dengan tipe berbeda, termasuk string, boolean, angka, daftar lain, atau bahkan hasil ekspresi:
(list 42 "hello" #t (list 1 2) (+ 3 4))- Ini membuat daftar dengan:
- Nomor (
42) - Sebuah string (
"hello") - Boolean (
#t) - Daftar lainnya (
(1 2)) - Hasil ekspresi (
(+ 3 4), yang dievaluasi menjadi7)
- Nomor (
Hasil: (42 "hello" #t (1 2) 7)
Contoh-contoh ini menunjukkan keserbagunaan daftar dalam Scheme, menjadikannya alat yang ampuh untuk mengatur dan memanipulasi data.
Membuat Daftar
Prosedur cons digunakan untuk membuat daftar baru dengan menggabungkan elemen dengan daftar yang sudah ada.
(cons new-element existing-list)Contoh
(cons 0 (list 1 2 3))- Tambahkan
0ke awal daftar(1 2 3).
Hasil: (0 1 2 3)
Memeriksa Daftar
Prosedur list? memeriksa apakah nilai yang diberikan merupakan daftar.
(list? value)Contoh: daftar?
(list? (list 1 2 3)) ; Memeriksa apakah (list 1 2 3) adalah daftar
(list? 42) ; Memeriksa apakah 42 adalah daftarHasil:
(list? (list 1 2 3))mengembalikan#t(benar)(list? 42)mengembalikan#f(salah)
Operasi pada Daftar
Scheme menyediakan beberapa prosedur bawaan untuk bekerja dengan daftar, termasuk:
length: Mengembalikan jumlah elemen dalam daftar.append: Menggabungkan dua daftar atau lebih menjadi satu.reverse: Mengembalikan daftar baru dengan elemen dalam urutan terbalik.
(length (list 1 2 3)) ; Mengembalikan 3
(append (list 1 2) (list 3 4)) ; Mengembalikan (1 2 3 4)
(reverse (list 1 2 3)) ; Mengembalikan (3 2 1)Hasil:
(length (list 1 2 3))kembali3(append (list 1 2) (list 3 4))kembali(1 2 3 4)(reverse (list 1 2 3))kembali(3 2 1)
Menggunakan list-ref
Prosedur list-ref mengambil elemen pada indeks daftar yang ditentukan (indeks berbasis nol).
(list-ref lst index)lst: Daftar tempat mengambil elemen.index: Indeks berbasis nol yang menunjukkan elemen mana yang akan dikembalikan.
Contoh: daftar-ref
(list-ref (list 10 20 30 40) 2) ; Mengambil elemen pada indeks 2Hasil: 30
Daftar Bersarang
Daftar dalam Scheme dapat berisi daftar lain sebagai elemen, sehingga menciptakan struktur bersarang.
Contoh: Membuat Daftar Bersarang
(define nested-list (list (list 1 2) (list 3 4) (list 5)))- Membuat daftar tiga elemen, yang masing-masing merupakan daftar itu sendiri.
Hasil: ((1 2) (3 4) (5))
Mengakses Data Bersarang
Untuk mengakses elemen dalam daftar bertingkat, Anda dapat menggunakan kombinasi car dan cdr untuk menavigasi struktur.
Contoh: Mengakses Elemen
(car nested-list) ; Mengambil elemen pertama: (1 2)
(car (car nested-list)) ; Mengambil elemen pertama subdaftar pertama: 1
(cdr (car nested-list)) ; Mengambil sisa subdaftar pertama: (2)
(car (cdr (car nested-list))) ; Mengambil elemen kedua subdaftar pertama: 2Penjelasan
1.car nested-list:
- Mengambil elemen pertama
nested-list, yaitu(1 2).
2.car (car nested-list):
- Mengambil elemen pertama
(1 2), yaitu1.
3.cdr (car nested-list):
- Mengambil sisa
(1 2), yaitu(2).
4.car (cdr (car nested-list)):
- Mengambil elemen pertama
(2), yaitu2.
Contoh: Mengakses Elemen dari Sublist Lain
(car (cdr nested-list)) ; Mengambil subdaftar kedua: (3 4)
(car (car (cdr nested-list))) ; Mengambil elemen pertama subdaftar kedua: 3Pendekatan ini memungkinkan Anda menavigasi dan mengakses elemen tertentu secara sistematis dalam daftar bertingkat, memberikan fleksibilitas yang kuat untuk bekerja dengan data hierarki.
Ringkasan
- Daftar dalam Scheme adalah struktur data yang serbaguna dan penting.
- Gunakan
listuntuk membuat daftar,cardancdruntuk mengakses elemen, danconsuntuk membuat daftar. - Prosedur bawaan seperti
length,append,reverse, danlist-refmembuat pengoperasian daftar menjadi mudah dan efisien. - Daftar dapat disarangkan, memungkinkan struktur data yang kompleks untuk kasus penggunaan tingkat lanjut.