0
Tải bản đầy đủ (.pdf) (90 trang)

Các hàm so sánh danh sách

Một phần của tài liệu TÀI LIỆU KIỂU DỮ LIỆU PHỨC HỢP_CHƯƠNG 3 DOC (Trang 25 -28 )

so sánh các danh sách, ng i ta dùng v t equal? : (equal? ’(a b 3) (list ’a ’b (+ 1 2))) --> #t

(equal? ’(()) ’()) --> #t

Ta đã g p có các v t xác đnh ki u d li u danh sách c a m t s-bi u th c : (list? s)--> #t n u giá tr c a bi u th c s là m t danh sách b t k (null? s)--> #t n u giá tr c a bi u th c s là m t danh sách r ng (pair? s)--> #t n u giá tr c a bi u th c s là m t danh sách khác r ng.

ôi khi ng i ta c n ki m tra n u m t s-bi u th c không ph i là m t danh sách và ki m tra n u m t danh sách có ph i đ c rút g n thành m t ph n t duy nh t không. Ta thêm các v t sau đây vào th vi n các ti n ích v n ch a có trong th vi n ti n đnh c a Scheme :

V t atom? ki m tra n u m t s-bi u th c không ph i là m t danh sách : (define (atom? s)

(not (pair? s)))

V t singleton? ki m tra m t danh sách đ c rút g n thành m t ph n t duy nh t : (define (singleton L)

(null? (cdr L)))

Ng i ta c ng th ng ph i ki m tra n u m t đ i t ng là m t ph n t m c th nh t c a m t danh sách. Mu n v y, ng i ta s d ng m t hàm ti n đnh (member S L). Hàm này tr l i m t ph n c a danh sách L ch a ph n đ u tiên (first ocurrence) c a giá tr s, ho c tr v #f n u danh sách L không có. S so sánh đ c th c hi n nh ki m tra equal? :

(member ’(b) ’(a b c d)) --> #f

(member ’(b) ’(a b c (b) d)) --> ((b) d)

Scheme xem các giá tr b ng nhau các m c đ chính xác khác nhau. V t equal? so sánh các c u trúc nh ng không ph i là s so sánh tên c a các đ i t ng. Tên c a các đ i t ng đ c ki m tra nh v t eq? và t n t i m t v t so sánh ít ch t ch h n là eqv?.

Nh v y, đ so sánh các danh sách ho c các chu i, ta s dung equal?, đ so sánh các s , s d ng = và đ so sánh các ký hi u, s d ng eq?. Scheme có ba hàm so sánh ho t đ ng nh sau :

member s d ng phép ki m tra equal? memv s d ng phép ki m tra eqv? memq s d ng phép ki m tra eq? Sau đây là đnh ngh a c a hàm member : (define (memq s L) (cond ((null? L) #f) ((eq? (car L) s) L) (else (memq s (cdr L))))) Ví d :

(memq ’(b) ’(a b c (b) d)) --> #f

(member ”tue” ’(”mon” ”tue” ”wed”)) --> (”tue” ”wed”)

(memq ’a ’(b c a d e)) --> (a d e)

(memq ’a ’(b c d e g)) --> #f

(memq ’a ’(b a c a d a)) --> (a c a d a) (memv 3.4 ’(1.2 2.3 3.4 4.5)) --> (3.4 4.5) (memv 3.4 ’(1.3 2.5 3.7 4.9)) --> #f (member ’(b) ’((a) (b) (c))) --> ((b) (c)) (member ’(d) ’((a) (b) (c))) --> #f (member ”b” ’("a" "b" "c")) --> (”b” ”c”)

III.4.2.3. D ng case x lý danh sách

D ng case t ng t cond nh ng th ng đ c dùng đ so sánh trên các danh sách. Cú pháp c a d ng case nh sau :

(case s

(L1 body1)

...

[ (else bodyN) ] )

Khi g p case, s-bi u th c s đ c tính và đ c hàm memv ki m tra n u giá tr cúa s thu c danh sách L1. N u đúng, case tr v giá tr c a body1, n u không, ti p t c ki m tra n u giá tr cúa s thu c v danh sách L2, v.v...

T ng t cond, các có th là nh ng dãy s-bi u th c và elle có th v ng m t. Ví d : (case (* 2 3) ((2 3 5 7 9) ’prime) ((1 4 6 8 9 11) ’composite)) --> ’composite (case (car ’(c d)) ((a e i o u) ’vowel) ((w y) ’semivowel) (else ’consonant)) --> ’consonant

(case (car ’(c d)) ((a) ’a)

((b) ’b))

--> không tr v k t qu gì (unspecified)

Ví d minh ho sau đây đnh ngh a m t hàm d ch các đ i t nhân x ng t ti ng Pháp qua ti ng Anh :

(define (pronoun-traduit pronounF) (case pronounF

((je) ’I)

((tu vous) ’you) ((il) ’he) ((elle) ’she) ((nous) ’we) ((ils) ’they) (else ’pronoun-inconnu))) (pronoun-traduit ’vous) --> you

C u trúc danh sách c a các ngôn ng h Lisp r t t ng quát. Do v y nó th ng đ c s d ng đ mô hình hoá t t c các ki u d li u thu c lo i ký hi u ho c không.

Gi s c n tính nghi m ph ng trình b c hai x2+ 2bx +c = 0 v i h s th c. V n đ là c n tính bi t th c delta = b2-c. Ta quy c s d ng danh sách đ bi u di n các l i gi i khác nhau c n c vào giá tr delta :

delta >0, hai nghi m th c phân bi t : (real x1 x2)

delta = 0, nghi m kép :(double x)

delta <0, nghi m ph c : (complex realpart imaginarypart)

Hàm tính nghi m ph ng trình b c hai nh sau : (define (trinomialroot b c)

(let ((delta (- (* b b) c))) (cond ((< 0 delta)

(let ((delta2root (sqrt delta))) (list ’real

(+ (- b) delta2root) (- (- b) delta2root))))

((zero? delta) (list ’double (- b)))

(else (let ((delta2root (sqrt (- delta)))) (list ’complex (- b) delta2root))))))

không l n l n các tính toán v i các k t qu in ra, ta vi t th t c solution- display d i đây s d ng case :

(define (solution-display solution) (case (car solution)

((real) (display ”2 real roots: ”) (display (cadr solution)) (display ” and ”)

(display (caddr solution)))

((double) (display ”1 racine reelle double: ”) (display (cadr solution)))

(else (display ” 2 racines complex conjuguees: ”) (display (cadr solution))

(display ” +/- i ”)

(display (caddr solution)))) (newline)) ; Qua dòng m i

(solution-display (trinomialroot 2 2)) --> 2 real roots: -0.585786 and -3.41421 (solution-display (trinomialroot -1 5)) --> 2 racines complex conjuguees: 1 +/- i 2 (solution-display (trinomialroot 1 1))

--> 1 racine reelle double: -1

III.4.2.4. K thu t đ quy x lý danh sách ph ng

Khi vi t m t ch ng trình nh n danh sách làm tham bi n, ng i ta có th s d ng phép

đ quy b ng cách chuy n phép tính hàm v tham bi n cdr c a danh sách. Sau đây, ta xét m t s ví d đ n gi n đ i v i các danh sách ph ng (ch có các ph n t m c m t).

Một phần của tài liệu TÀI LIỆU KIỂU DỮ LIỆU PHỨC HỢP_CHƯƠNG 3 DOC (Trang 25 -28 )

×