Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 60 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
60
Dung lượng
801,95 KB
Nội dung
1 CH NG V C U TRÚC D LI U T a bi t r ng vi c l p trình ph thu c ph n l n vào cách mơ hình hố d li u c a tốn c n gi i M i quan h gi a thu t toán c u trúc d li u l p trình ã c Niclaus Wirth, tác gi ngơn ng l p trình Pascal, a m t công th c r t n i ti ng : C u trúc d li u + Thu t toán = Ch ng trình (Data structure + Algorithms = Programs) Nh ã th y, thu t toán m i ch ph n ánh thao tác c n x lý, cịn i t ng x lý máy tính l i d li u Nói n thu t tốn nói n thu t tốn ó tác ng lên d li u Cịn nói n d li u nói n d li u y c n c tác ng b i thu t toán a n k t qu mong mu n D li u bi u di n thông tin c n thi t gi i toán, g m d li u a vào, d li u a d li u tính toán trung gian M t c u trúc d li u liên quan n ba y u t : ki u d li u, phép toán tác ng lên d li u cách bi u di n d li u b nh c a máy tính tu theo cơng c l p trình Trong ch ng này, s trình bày m t s c u trúc d li u tiêu bi u nh t p h p, ng n x p, danh sách móc n i, V.1 T ph p Trong toán h c, t p h p (set) m t nhóm hay m t b s u t p i t ng1 phân bi t {x1, x2, …, xn}, c g i ph n t (elements) c a t p h p Do m i ph n t c a m t t p h p ch c li t kê m t l n không c s p x p th t nên ng i ta khơng nói n ph n t th nh t, ph n t th hai, v.v Ví d hai t p h p sau ây ng nh t : { a, b, d, a, d, e, c, d } = { a, b, c, d } Do t p h p c ng m t danh sách, ng i ta có th s d ng c u trúc danh sách bi u di n t p h p Scheme Nh v y, m t t p h p r ng m t danh sách r ng so sánh hai t p h p có b ng khơng, ta có th s d ng v t equal? nh sau : (define (setequal? E1 E2) (cond ; hai t p h p r ng b ng ((and (null? E1) (null? E2)) #t) ; hai t p h p có hai ph n t u tiên b ng Khái ni m i t ng c a t p h p có tính tr c giác, nhà toán h c ng i c G Cantor a t n m 1985 n n m 1902, nhà tri t h c ng i Anh B Russell ã ch nh ng ngh ch lý toán h c (paradox) hay nh ng mâu thu n lôgic lý thuy t t p h p 147 148 L P TRÌNH HÀM ((equal? (car E1) (car E2)) (setequal? (cdr E1) (cdr E2))) ; hai t p h p có hai ph n t u tiên khác khác !!! (else #f))) (setequal? ’(1 6) ’(1 6)) > #t ho c : (define E1 ’(a b c d e)) (define E2 E1) (setequal? E1 E2) > #t ý r ng v t setequal? ây, ta ch a x lý hai t p h p có ph n t gi ng y có s ph n t , nh ng không c s p x p th t nh : (setequal? '(1 6) '(1 6)) > #f Sau ây ta s s d ng th ng xuyên hàm member m t ph n t có thu c m t danh sách ã cho hay không : ; Tr ng h p ph n t ki m tra có ki u (member ’c ’(a b c d e)) > ’(c d e) x lý t p h p Hàm ki m tra n gi n ; Tr ng h p ph n t ki m tra có ki u ph c h p (member (list ’a) ’(b (a) c)) > ’((a) c) V t in? ki m tra m t ph n t có thu c m t t p h p ã cho hay không ? (define (in? x E) (cond ((null? E) #f) ; danh sách r ng ((member x E) #t) ; x ph n t ki u n gi n (else (in? x (cdr E))))) ; x ph n t ki u ph c h p (in? ’c E1) > #t xây d ng m t t p h p t m t danh sách, ng i ta ph i lo i b ph n t trùng l p Hàm list->set sau ây s d ng hàm member l n l t ki m tra ph n t c a danh sách ã cho K t qu tr v ch gi l i ph n t cu i i v i nh ng ph n t trùng ch a s p x p l i ph n t theo th t (xem ph ng pháp s p x p nhanh cu i ch ng) (define (list->set L) (cond ((null? L) ’()) ((member (car L) (cdr L)) (list->set (cdr L))) (else (cons (car L) (list->set (cdr L))))) (list->set ’(a b d a d e c d)) > ’(b a e c d) (define (union2 E1 E2) (cond ((null? E1) E2) C U TRÚC D LI U 149 ((member (car E1) E2) (union2 (cdr E1) E2)) (else (cons (car E1) (union2 (cdr E1) E2))))) Phép h p t p h p Gi s cho hai t p h p E1 E2, ta c n tìm k t qu c a phép h p c a hai t p h p E1 E2 m t t p h p nh sau : (define (union2 E1 E2) (cond ; t p h p th nh t r ng k t qu t p h p th hai ((null? E1) E2) ; n u t p h p th nh t có ph n t thu c t p h p th hai b qua ((member (car E1) E2) (union2 (cdr E1) E2)) ; ti p t c sau gi m kích th c t p h p th nh t (else (cons (car E1) (union2 (cdr E1) E2))))) (union2 ’(1 7) ’(2 6)) > ’(1 6) M r ng phép h p c a hai t p h p, ta xây d ng phép h p t p h p b t k b ng cách s d ng hàm list-it ã c nh ngh a ch ng tr c : (define (union Lset) (list-it union2 Lset ’())) (union ’(1 4) ’(2 6) ’(4 7) ’(6 8)) > ’(1 8) Phép giao t p h p T ng t cách xây d ng phép h p t p h p b t k , tr c tiên ta xây d ng phép giao c a hai t p h p E1 E2 nh sau : (define (intersection2 E1 E2) (cond ; n u m t t p h p r ng k t qu c ng r ng ((null? E1) E1) ; ch n ph n t n m c hai t p h p ((member (car E1) E2) (cons (car E1) (intersection2 (cdr E1) E2))) ; ti p t c sau gi m kích th c t p h p th nh t (else (intersection2 (cdr E1) E2)))) (intersection2 ’(1 4)’(2 6)) > ’(2 4) M r ng phép giao c a hai t p h p, ta xây d ng phép giao t p h p b t k b ng cách s d ng hàm apply ã c nh ngh a m c Error! Reference source not found : (define (intersection Lset) (cond ; giao c a t p h p r ng c ng r ng ((null? Lset) ’()) ; giao c a m t t p h p ((null? (cdr Lset)) (car Lset)) ; a v th c hi n phép giao c a hai t p h p (else (intersection2 (car Lset) (apply intersection (cdr Lset)))))) 150 L P TRÌNH HÀM (intersection ’(1 4) ’(2 6) ’(4 7)) > ’(4) Phép hi u c a hai t p h p Cho hai t p h p E1 E2, ta âënh nghéa phép hi u c a hai t p h p E1\E2 nh sau : (define (difference E1 E2) (cond ; n u E2 r ng k t qu E1 ((null? E2) E1) ; n u E1 r ng k t qu r ng ((null? E1) ’()) ; n u E1 có ph n t thu c E2 b qua ((member (car E1) E2) (difference (cdr E1) E2)) ; ti p t c sau gi m kích th c t p h p E1 (else (cons (car E1) (difference (cdr E1) E2))))) (difference ’(1 5) ’(1 2)) > ’(3 5) Tìm t p h p c a m t t p h p Cho tr c t p h p E, ta c n tìm t p h p t t c t p h p (sub-set) c a E, ký hi u 2E Ch ng h n cho E={ a, b, c } 2E ={ , {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}} có t t c ph n t bao g m t p h p r ng b n thân t p h p E N u t p h p E r ng, 2E c ng r ng N u E khác r ng, xét m t ph n t a E, ó có t p h p ch a a t p h p không ch a a u tiên xây d ng t p h p E\{a}, sau ó, chèn a vào t t c t p h p c a E\{a} Ta có hàm subset nh sau : (define (subset E) (if (null? E) (list ’()) (let ((Lremain (subset (cdr E)))) (append Lremain (map (lambda (L) (cons (car E) L)) Lremain))))) (subset ’(a b c)) > ’(() (c) (b) (b c) (a) (a c) (a b) (a b c)) V.2 Ng n x p Danh sách ki u «ng n x p» (stack), cịn c g i «ch ng» (t ng t m t ch ng a, m t b ng n ), m t c u trúc d li u mà phép b sung hay lo i b m t ph n t luôn c th c hi n m t u g i nh (top) Nguyên t c ho t ng «vào sau tr c» c a ng n x p ã d n n m t tên g i khác danh sách ki u LIFO (Last In First Out) Ng n x p c s d ng r t ph bi n tin h c Hình V.1 minh ho ho t ng c a m t ng n x p th c hi n th t c quy tính n! C U TRÚC D V.2.1 LI U 151 Ki u d Sau ây li u tr u t c t c u trúc d li u tr u t ng ng n x p ng ki u ng n x p : Types Stack(T) functions empty-stack : Stack(T) empty-stack? : Stack(T) boolean push-stack : T Stack(T) Stack(T) pop-stack : Stack(T) - Stack(T) / top-stack : Stack(T) - T / preconditions pop-stack(s: Stack(T)) ch xác nh ch (not empty-stack?(s)) top-stack(s: Stack(T)) ch xác nh ch (not empty-stack?(s)) axioms var x: T, s : Stack(T) empty-stack?(empty-stack) = true empty-stack?(push-stack (x, S)) = false pop-stack(push-stack (x, S)) = S top-stack(push-stack (x, S)) = x fac(0)=1 fac(1)=? fac(2)=? fac(3)=? fac(3)= ? 1*fac(0) 2*fac(1) 2*fac(1) 3*fac(2) 3*fac(2) 3*fac(2) fac(3)=3*fac(2) fac(2)=2*fac(1) fac(1)=1*fac(0) 1*1 2*fac(1) 2*1 3*fac(2) 3*fac(2) fac(1)= fac(2)=2*1=2 Hình V.1 Ho t 3*2 fac(3)= 3*2 ng c a ng n x p th c hi n th t c fac(3)= quy tính n! Ta c n xây d ng hàm Scheme thao tác ng n x p nh sau : (empty-stack? (empty-stack)) #t 152 L P TRÌNH HÀM (empty-stack? (push-stack x S)) #f (pop-stack (push-stack x S)) > S (top-stack (push-stack x S) > x V.2.2 Xây d ng ng n x p b) S $ S a) $ Có nhi u cách bi u di n c u trúc d li u ki u ng n x p Scheme Ph ng pháp t nhiên h n c bi u di n ng n x p d i d ng m t danh sách mà thao tác b sung lo i b m t ph n t c th c hi n m t u danh sách Trong Scheme, m i l n b sung m t ph n t vào danh sách kéo theo vi c t o m t b ôi (dotted pair) m i Hình V.2 Ho t ng b sung (a) lo i b (b) m t ph n t c a ng n x p Ta có hàm Scheme nh sau : (define (empty-stack) ’()) (define empty-stack? null?) (define (push-stack x S) (cons x S)) (define (pop-stack S) (if (empty-stack? S) (display ”ERROR: stack is empty!”) (cdr S))) (define (top-stack S) (if (empty-stack? S) (display ”ERROR: stack is empty!”) (car S))) Ta th y thao tác ng n x p t ng t i v i danh sách Sau ây m t s ví d minh ho thao tác ng n x p s d ng hàm ã có phù h p v i ca1c tiên c t ây : (empty-stack? (push-stack 'a (empty-stack))) > #f (pop-stack (push-stack ’a ’(1 3))) > ’(1 3) C U TRÚC D LI U 153 (pop-stack (push-stack ’a ’(1 3))) > ’(1 3) (top-stack (push-stack ’a ’(1 3))) > ’a (top-stack (pop-stack (push-stack (pop-stack (push-stack (push-stack (pop-stack (push-stack (push-stack (empty-stack)))))))))) > V.2.3 Xây d ng trình so n th o v n b n Sau ây m t ví d n gi n minh ho ng d ng ng n x p xây d ng m t trình so n th o n gi n cho phép th c hi n vào t ng dòng v n b n m t Ho t ng nh sau : hàm nh n dòng vào m t tham bi n l u gi m t vùng nh trung gian (buffer) Dòng vào ch a ký t h n h p mà m t ký t ó có th m t l nh so n th o (edit command) Có b n lo i ký t nh sau : Các ký t khác ba ký t #, $ newline vùng nh trung gian ng tr u ký t v n b n Ký t # dùng xoá ký t Ký t $ dùng c l u gi c vùng nh trung gian xoá t t c ký t vùng nh trung gian Ký t qua dòng newline k t thúc m t dòng vào a n i dung vùng nh trung gian lên hình Ta s s d ng m t ng n x p bi u di n vùng nh trung gian Trong ch ng trình có s d ng m t hàm c c b loop c ký t liên ti p t dòng vào Ch s i ký t ang c th i (define (lineeditor str) (let ((L (string-length in-str))) (letrec ((loop (lambda (i buffer) (if (< i L) (let ((readchar (string-ref in-str i))) (case readchar ((#\#) (loop (+ i 1) (pop-stack buffer))) ((#\$) (loop (+ i 1) (empty-stack))) ((#\.) (map (display (reverse buffer))) (else (loop (+ i 1) (begin (display "ERROR: dot is the end of command!") (newline)))))) (loop (empty-stack))))) (lineeditor "XY$abce#def.") > abcdef 154 L P TRÌNH HÀM Ng i c có th phát tri n trình so n th o ây b n ph c t p h n V.2.4 Ng n x p x lý tình hu ng so n th o v n t bi n Ta mu n r ng ho t ng c a ng n x p g n g i v i ch ng (pile) h n, ngh a vi c b sung lo i b ph n t ch liên quan n m t ch ng ta có th gán cho bi n Ta xây d ng ki u d li u tr u t ng ng n x p t bi n (mutable stack) Stack!(T) (sau tên có m t d u ch m than) nh sau : Types Stack!(T) functions empty-stack! : Stack!(T) empty-stack!? : Stack!(T) boolean push-stack! : T Stack!(T) Stack!(T) pop-stack! : Stack!(T) - T / top-stack! : Stack!(T) - T / phân bi t v i ng n x p ã xét, ta thêm vào sau tên ki u hàm m t d u ch m than ! t ng t t bi n i m ho t ng khác bi t c a ng n x p t bi nlà sau lo i b m t ph n t hàm tr v ph n t nh Trong ch ng tr c, xét môi tr ng làm vi c c a Scheme, ta th y r ng không th s d ng l nh set! thay i n i dung c a ng n x p ch ng h n nh : (define (push-stack x s) (set! s (cons x s)) s) Ta ph i áp d ng tính ch t t bi n c a danh sách, b ng cách bi u di n ng n x p r ng (empty stack) b i m t danh sách khác r ng sau ó thay i b i cdr (define (empty-stack!) (list ’stack!)) (define (empty-stack!? S) (and (pair? S) (null? (cdr S)) (eq? ’stack! (car S)))) (define S1 (empty-stack!)) S1 ; xem n i dung c a ng n x p > ’(stack!) (empty-stack!? S1) > #t b sung (push) lo i b (pop) ng n x p S, ta gi thi t r ng bi n S luôn tr n m t b ôi T t c thao tác v t lý c th c hi n nh l nh cdr nh minh ho hình d i ây Lúc ng n x p r ng, danh sách S ch ch a ph n t ’stack! Sau b sung ph n t ’bob ph n t ng th hai (ngay sau ’stack!) danh sách S Ta xây d ng hàm nh sau : (define (push-stack! x S) (set-cdr! S (cons x (cdr S)))) 190 L P TRÌNH HÀM Khi Scheme tìm ki m m t giá tr t ng ng v i m t tên, Scheme s xem xét tr c tiên khung t ng ng v i nh ngh a c c b , r i sau ó, n u c n thi t, Scheme s xem xét khung t ng ng v i nh ngh a toàn c c, v.v Nh v y, m t nh ngh a s c t d u t i ch m t nh ngh a toàn c c (define x 1) (define (f x) x) (f 2) > x > (define (g L) (define car cdr) (car L)) (g ’(1 5)) > ’(2 5) Ta ã thay i, m t cách c c b , hàm ti n nh car b i cdr bên i u không nh h ng n car hàm g : nh ngh a hàm g, (car ’(1 3)) > Tuy nhiên ta không nên thay lo i nh : (define car cdr) Lúc này, ho t i hàm ti n nh mơi tr ng tồn c c (m c nh), i ng c a car không úng n a : (car ’(1 3)) > ’(2 3) > (cdr ’(1 3)) > ’(2 3) Mơi tr ng tồn c c c rút g n v m t khung ch a bi n ti n nh ngh a (cons, car, cdr, ) bi n c a ng i s d ng Scheme tính giá tr m t bi u th c mơi tr ng tồn c c M t hàm c bi u di n b i m t c p [I ; E], ó I danh sách l nh c a hàm, E mơi tr ng ó hàm c tính Khi b d ch Scheme g i m t hàm m t mơi tr ng, t o m t khung m i C ch a c p : (tham i hình th c, tham i th c s ) Ti p theo, b d ch th c hi n hàm môi tr ng (C, C1, C2, , Cn), ó, danh sách khung (C1, C2, , Cn) môi tr ng x lý c a hàm Mơi tr ng có th khơng liên quan n mơi tr ng g i c a Khi hàm t o bi n (nh l nh define) b t u c th c hi n, b d ch Scheme thêm c p bi n = giá tr t ng ng vào khung C Ví d : (define x 1) MÔI TR NG VÀ C P PHÁT B NH 191 (define (f y) (define x 2) (+ x y)) Ngoài bi n ã nh ngh a tr c ó, lúc khung C c a mơi tr ng tồn c c ch a c p : x = 1, f = P, ó P = [I ; E] , I = (lambda (y) (define x 2) (+ x y)), E = (C) L i g i (f 5) s gây : T o khung C’ = { y = 5} Th c hi n l nh I (C’, C) Sau (define x 2), C’ = { x = 2, y = 5} Th c hi n (+ x y), k t qu hàm + c nh ngh a C ây, x y c nh ngh a khung C’, Do v y l i g i (f 5) cho k t qu : (f 5) > Bây gi ta xét l i tốn cân i tài kho n ngân hàng (ví d (define account (create-account 1000)) s gây : Hàm create-account c g i môi tr ng (C’, C) C’ = {S = 1000}, C khung toàn c c Sau th c hi n (define (switch m) ), C’ = { switch = P, S = 1000 }, v i P = [ l nh c a switch ; (C’, C) ] Hàm create-account tr v giá tr c a switch, P Bi n account có giá tr hàm : P = [ l nh c a switch ; (C’, C) ] Khi có l i g i : (balance account) c ng có ngh a : (account ’balance) b d ch Scheme th c hi n l nh c a switch môi tr ({m = solde}, C’, C) Giá tr c a S C’, t c 1000 Và g i : ((withdrawal! account) 100) c ng có ngh a th c hi n l i g i : (account ’withdrawal!) ng : m c tr c) L i g i : 192 L P TRÌNH HÀM b d ch Scheme th c hi n hàm t o tài kho n b i (withdrawal! account), r i g i hàm tham s 100 : Các l nh c a switch c tính môi tr E = ({ m = withdrawal!}, C’, C) ng : Thông i p withdrawal! gây vi c tính m t hàm m i [I’ ; E], ó I’ = (lambla (n) (if ) (set! S (- S n))) L i g i c a hàm th c hi n l nh môi tr ng : (C’’, { m =withdrawal! }, C’, C), ó C’’ = { n =100 } (set! S (- S n)) thay Khung C’ ã b thay i giá tr c a S khung ch a S, C’ i: C’ = { switch = P, S = 900 } s d ng x lý cân account, S có giá tr 900 i tài kho n sau này, add! withdrawal! hàm VI.4 li u Vào/ra d Các th t c vào/ra c a Scheme cho phép c d li u vào t c ng vào (input port) d li u c ng (output port) C ng có th bàn phím, hình, hay t p (file) a Trong ch ng tr c, ã c làm quen v i hàm read ( c d li u vào t bàn phím), write display ( a d li u hình) Các hàm xem bàn phím, hình c ng vào/ra m c nh (console) C ng vào có giá tr ’current-input-port’ c ng có giá tr ’current-output-port’ Các c ng vào/ra m c nh có th t làm tham i port hàm vào/ra Ch ng h n : (define e (read)) (write e) hay có tham i port : (define (read (current-input-port))) (write e (current-output-port)) hi u qu nh VI.4.1 Làm vi c v i t p T p ph ng ti n l u tr m t dãy d li u b t k m t thi t b nh nh a m m, a c ng, CD-ROM, b ng t , v.v T p c t tên theo quy c c a h i u hành d dàng truy c p n h th ng th m c t ch c ki u phân c p làm vi c ( c/ghi) v i t p, c n thi t l p s liên k t gi a t p v i m t h th ng Scheme S liên k t t o m t lu ng hay dòng d li u (data flow) gi a t p hàm vào/ra c a Scheme Khi c (read) m t t p, c n liên k t t p v i dòng vào (input flow) c a Scheme cung c p hàm c Khi ghi lên (write) m t t p, c n liên k t t p v i dòng (output flow) c a Scheme cung c p hàm a (ghi) Scheme có hàm liên k t m t dòng d li u v i m t t p nh sau : MÔI TR NG VÀ C P PHÁT B NH 193 (open-input-file filename) > liên k t dòng vào v i t p filename ã có m t thi t b nh (open-output-file filename) > liên k t dòng v i t p filename c n t o Sau s d ng m t dòng d li u, c n ph i óng l i b i : (close-input-port flow) > óng dịng vào flow (close-output-port flow) > óng dịng flow liên k t m t t p v i m t dòng, c n s d ng hàm sau ây : (call-with-input-file filename fct) (call-with-output-file filename fct) Các hàm s óng t ng dòng sau s d ng xong Tham bi n fct ph i m t hàm có m t tham bi n cho tham bi n c liên k t v i dòng th c hi n thân hàm dòng s t óng l i sau th c hi n xong i v i tr ng h p call-with-input-file, t p truy c p n ã có m t thi t b nh , i v i tr ng h p call-with-output-file, l i g i tác d ng n u t p ã t n t i Dòng d li u m t it ng Scheme ó có th c ki m tra b i v t : (input-port ? s) > #t n u s m t dòng vào (output-port ? s) > #t n u s m t dịng Nh ã nói trên, dịng vào hi n hành cho b i hàm (current-input-port), dòng hi n hành cho b i hàm (current-output-port) VI.4.2 Các hàm Các hàm cd li u t p ct p c t p c a Scheme có m t tham i tu ch n (optional) m t dòng Hàm : (read [flow]) c s-bi u th c u tiên t i v trí u c c a t p liên k t v i dòng flow d i u c n v trí b t u c a s-bi u th c ti p theo, sau ký t cu i c a s-bi u th c ã c Khi u c i n cu i t p, m t i t ng ánh d u k t thúc t p (end of file) c nh n bi t b i v t : (eof-object ? s) Gi s t i th m c hi n hành ang l u gi t p ”mailto.txt” có n i dung : University of Danang 41, Le Duan St., Danang City, Vietnam Tel: (84.511) 822041, 832678 – Fax: (84.511) 823683 194 S d ng read L P TRÌNH HÀM c m t s-bi u th c nh liên k t dòng vào v i t p nh sau : (define flow (open-input-file ”mailto.txt”)) flow > ’#{Input-port #{Input-channel ”mailto.txt”}} (define s1 (read flow)) s1 > ’university (define s2 (read flow)) s2 > ’of Ho c s d ng k t t p v i dòng vào : (call-with-input-file ”mailto.txt” (lambda (flow) (let ((s (read flow))) s))) > ’university Chú ý tham bi n th hai c a call-with-input-file m t hàm m t bi n, ây nh ngh a hàm b i lambda theo bi n flow Hàm read th c t m t b phân tích cú pháp (syntax analyser) cho s-bi u th c, b ng cách chuy n cách bi u di n bên c a s-bi u th c có m t t p thành bi u di n bên sau ó c x lý b i Scheme Ti p theo ây m t ví d minh ho q trình c t p Ta xây d ng v t ki m tra m t sbi u th c s ã cho (trong tr ng h p toàn b m t nh ngh a hàm h p th c) có m t m t t p f g m s-bi u th c hay không (s f?) V t s d ng m t vòng l p nh letrec c t ng s-bi u th c so sánh v i s cho n tho mãn ho c g p ký hi u k t thúc t p (define (expr-present? s f) ; f tên hàm s c (letrec ((loop ; xây d ng vòng l p cho n g p ký hi u k t thúc t p (lambda (flow) (let ((expr-read (read flow))) (cond ((eof-object? expr-read) #f) ; ki m tra b ng hai s-bi u th c ((equal? expr-read s) #t) (else (loop flow))))))) ; liên k t t p f v i dòng d li u vào (call-with-input-file f loop))) Vi c g i v t c th c hi n nh sau : (expr-present? ’Danang ”mailto.txt”) > #t Scheme cịn có hàm c t ng ký t dòng vào Hàm : (read-char [flow]) c vào m t ký t di chuy n u c sang ký t ti p theo (ng i c có th tìm hi u sâu h n tài li u «Revised(5) Report on the Algorithmic Language Scheme») Hàm : (peek-char [flow]) c vào m t ký t nh ng không di chuy n u c sang ký t ti p theo MÔI TR NG VÀ C P PHÁT B NH 195 Scheme không cho phép s d ng read c m t t p d li u b t k (ki u Pascal), mà ph i c t ng ký t m t b i read-char Ch ng h n : (define flow (open-input-file ”mailto.txt”)) (read-char flow) > #\U L i g i sau ây c ký t u c a t p ”mailto.txt” : (call-with-input-file ”mailto.txt” (lambda (flow) (let* ((c1 (read-char flow)) (c2 (read-char flow)) (c3 (read-char flow)) (c4 (read-char flow))) (list c1 c2 c3 c4)))) > ’(#\U #\n #\i #\v Sau ây ta xây d ng hàm readfile th c hi n c chép n i dung m t t p lên hình Ho t ng c a readfile t ng t v t expr-present? v a nh ngh a ây : s d ng m t vòng l p nh letrec c l n l t ký t b i read-char r i a hình cho n g p ký hi u k t thúc t p eof : (define (read-file f) (letrec ((loop (lambda(flow) (let ((char (read-char flow))) (if (not (eof-object? char)) (begin (display char) (loop flow))))))) (call-with-input-file f loop))) (read-file ”mailto.txt”) > University of Danang 41, Le Duan St., Danang City, Vietnam Tel: (84.511) 822041, 832678 – Fax: (84.511) 823683 T p v n b n M t s t p có c u trúc m t chu i liên ti p kh i (block) Ch ng h n t p v n b n m t chu i dòng (line), m i dòng m t kh i c k t thúc b i d u qua dòng Trong Scheme d u qua dòng ký t quy c #\newline ánh d u v trí cu i c a m t kh i, ng i ta th ng s d ng m t ho c nhi u ký t phân cách (separator mark) Vi c c c th c hi n l n l t cho kh i c a t p D i ây hàm read-block c t t c kh i m t dòng tr v k t qu m t chu i ký t Hàm s d ng hai tham i, m t tham i dòng vào liên k t v i t p v n b n m t tham i v t separator? cho phép x lý c ký t phân cách khác Hàm bên m t vòng l p tích l y ký t c a kh i v a c vào m t danh sách sau ó chuy n i danh sách thành chu i tr c t vào cu i chu i k t qu Tr c c m t kh i, c n g i hàm read-separator xoá h t ký t phân cách : (define (read-block flow separator?) (letrec 196 L P TRÌNH HÀM ((loop (lambda (Lcar) (let ((c (peek-char flow))) (if (separator? c) (list->string (reverse Lcar)) (loop (cons (read-char flow) Lcar))))))) (read-separator separator? flow) (loop ’()))) N u mu n ngh a nh sau : c t ng dòng t p v n b n, ta s d ng v t séparator? c nh (define (separator?) (lambda(char) (eq? #\newline char)) Tuy nhiên ta c ng có th c t p theo t ng t (word) Thông th ng t t cách b i ký t : kho ng tr ng hay d u cách (space), ký t thoát (escape), nh y c t (tabulation), d u qua dòng, d u k t thúc trang Trong Scheme, ký t c nh n bi t b i v t char-whitespace? N u s d ng d u ch m câu m t v n b n ch c n b sung thêm ký t phân cách (char-whitespace? #\space) > ’#t VI.4.3 Ghi lên t p Các hàm ghi lên t p Các hàm ghi lên t p c liên k t v i m t dòng : (write s [flow]) (display s [flow]) (newline [flow]) (write-char char [flow]) Sau th c hi n ghi lên t p, hàm tr v m t giá tr khơng xác nh khơng a lên hình Trong Scheme, vi c ghi lên t p b i display làm ng i c d ck t qu , nh ng ghi lên t p b i display Scheme l i d c (d x lý) h n Ta so sánh l i g i sau : (write #\n) > ’#\n (display #\n) > n (write ”tom and jerry”) > ”tom and jerry” (display ”tom and jerry”) > tom and jerry Nh v y write gi nguyên t t c ký t c bi t c a chu i ghi lên t p Scheme cịn có hàm ghi lên t p t ng ký t dòng Gi s ta c n t o th m c hi n hành t p ”mailto.txt” có n i dung sau : (define flow (open-output-file ”mailto.txt”)) (display ”University of Danang” flow) MÔI TR NG VÀ C P PHÁT B NH 197 (newline flow) ; ghi ký t qua dòng (display ”41, Le Duan St., Danang City, Vietnam” flow) (newline flow) ; ghi ký t qua dòng (display ”Tel: (84.511) 822041, 832678 - Fax: (84.511) 823683” flow) (close-output-port flow) G i hàm readfile xem l i n i dung : (readfile ”mailto.txt”) University of Danang 41, Le Duan St., Danang City, Vietnam Tel: (84.511) 822041, 832678 - Fax: (84.511) 823683 Khi t o t p, ghi ký t qua dòng, ta c ng có th s d ng hàm write-char : (write-char #\newline flow) L nh chép t p Sao chép t p (copy) th ng xuyên c s d ng làm vi c v i t p Ta xây d ng hàm copy-file t ng t hàm c t p read-file Hàm chép t p s x lý l n l t t ng ký t t u t p n cu i t p, cho n g p ký hi u eof Trong hàm, ta dùng m t vòng l p d ng t t p (define (copy-file source target) (call-with-input-file source (lambda (input-flow) (call-with-output-file target (lambda (output-flow) (do ((char (read-char input-flow) (read-char input-flow))) ((eof-object? char)) (write-char char output-flow))))))) (copy-file "mailto.txt" "uodn.txt") #t Khi c n làm vi c v i t p ch a hàm Scheme, ta có th thay th vi c c t ng ký t b i c nguyên m t s-bi u th c Tuy nhiên, theo cách này, dịng thích s không c chép M t cách t ng quát, n u ta có m t t p c t ch c theo c u trúc d ng kh i, ta có th chép t ng kh i b ng cách s d ng ch c n ng c ho c ghi kh i Sau ây m t ch ng trình th c hi n chép t p theo kh i : (define (copy-flow flow-in flow-out rd-block wr-block) (letrec ((loop (lambda() (let ((block (rd-bloc flow-in))) (if (eof-object? block) ’undefine (wr-bloc bloc flow-out)))))) (loop))) 198 L P TRÌNH HÀM VI.4.4 Giao ti p v i h th ng Quá trình giao ti p gi a NSD v i h th ng ph thu c cách cài t trình thơng d ch c a Scheme Tuy nhiên, Scheme chu n có hàm load cho phép t i m t t p ch a ch ng trình Scheme vào b nh s n sàng g i ch y Cú pháp c a hàm load nh sau : (load filename) Ví d : Gi s t i th m c hi n hành có ch a t p ch N i», NSD n p vào b nh g i ch y nh sau : (load ”hanoi.scm”) > hanoi.scm (hanoi #\A #\B #\C) Move one disk from Move one disk from Move one disk from Move one disk from Move one disk from Move one disk from Move one disk from A A B A C C A to to to to to to to B C C B A B B Chú ý r ng giá tr tr v c a load không nh h input-port current-output-port Bài t p ch ng trình l i gi i tốn «Tháp Hà ng n giá tr tr v c a current- ng Cho bi t giá tr tr v t : ((lambda (a) (let ((a 1)) ((f (lambda (x) (+ a x)))) (f a))) 5) > ? V kh i liên k t cho ch u làm vi c sau ây (let*((x 2) (y (+ x x)) (z (* x y))) (let ((x y) (y x) (+ *)) (+ x y z))) Ch liên k t hi n hành c a bi n (+ x y z) ? T i không th dùng car thay head n u nh ngh a l i car ph n trình bày lý thuy t ? Gi i thích ng i ta khơng th s d ng nh ngh a ây : (define car (lambda (L) (if (null? L) ’() (car L)))) MÔI TR NG VÀ C P PHÁT B NH 199 Vi t hàm : a) Tính s l ng ký t m t t p ? b) Tính s l ng ký t không ph i ký t phân cách (không ph i d u cách, nh y c t, hay qua dòng) ? Vi t hàm so sánh hai t p v n b n tr v dòng v n b n u tiên khác gi a hai t p ? T b n s nguyên d ng A, B, C, D cho A 31, B 12, 1000 C 2000, D (ý ngh a c a b n s ngày A tháng B n m C ngày th D, ó D=1 ngày Ch nh t, D=2 ngày th Hai, D=7 ngày th B y) ba s nguyên d ng A1, B1, C1 thoã mãn i u ki n t ng ng i v i A, B, C, cho bi t ngày A1 tháng B1 n m C1 ngày th m y ? Chú ý n n m nhu n Cho s nguyên d ng n bi n th c x thay i t n v i b c t ng h = 0.01 Hãy tính tích phân : I sin n x dx V i giá tr c a n I c tính theo cơng th c : n n 2 n n v i n ch n, n v inl ,n T danh sách s nguyên a0, a1, a2 , a3, a4, tr v m i nghi m nguyên có th c a ph ng trình a th c b c h s nguyên : a0 + a1x + a2 x2 + a3 x3 + a4 x4 = Cho s th c x thay i t n v i b c t ng h = 0.01 n nguyên d ng, b ng cách s d ng c hai ph ng pháp quy l p, tính giá tr c a a th c Tseb sep b c n c cho b i công th c truy h i nh sau : Tn(x) = 2xTn 1(x) Tn 2(x) v i n = 2, 3, 4, Trong ó : T0(x) = 1, T1(x) = x Un+2(x) = xUn+1(x) - 0.25Un(x) v i n = 0, 1, 2, Trong ó : U0(x) = 1, U1(x) = x 10 Cho s th c x thay i t n v i b c t ng h = 0.01 n nguyên d ng, b ng cách s d ng c hai ph ng pháp quy l p, tính giá tr c a a th c Legendre b c n c cho b i công th c truy h i nh sau : Ln+2(x) = xLn+1(x) - (n + 1)2 Ln (x) (2n + 1)(2n + 3) v i n = 0, 1, 2, Trong ó : L0(x) = 1, L1(x) = x 11 Cho s th c x thay i t n v i b c t ng h = 0.01 Tính t ng : x2 x3 xn S = - x + + + (-1) n + 2! 3! n! v i xác cho tr c, ch ng h n = 10-5 200 L P TRÌNH HÀM 12 Cho s th c x thay Tính giá tr : y= it x + n1v ib x + + c t ng h = 0.01 n nguyên d có n > d u c n x 13 Cho s th c x thay i t n v i b Tìm nghi m ph ng trình vi phân : f(x) = cos x - `c t ng h = 0.01 n nguyên d ng x bi t r ng nghi m Dùng ph ng gi a i m c a hàm cos x, ngh a ng pháp l p Newton : x n +1 , , 2 f(x n ) , v i f ‘(x) =x f '(x n ) n o hàm c a f 14 Dãy Fibonaci c nh ngh a nh sau : f0 = f1 = fn = fn-1 + fn-2 v i n Vi t v t ki m tra m t s nguyên m cho tr 15 Cho s n nguyên d nh sau : a1 = a2 = c có ph i s Fibonaci khơng ? ng, tìm giá tr an c xác nh t dãy s nguyên a1, a2, , an an = an-1 + * (n 1) 16 Cho s th c x thay 1+ v i it n1v ib c t ng h = 0.01 Tính t ng : x2 x4 x6 + + + xác cho tr c, ch ng h n = 10-5 17 Tìm t t c s có ch s cho t ng l p ph ng c a ch s b ng s Ch ng h n g i a, b, c ch s c a s c n tìm, ó i u ki n c mô t : ó 100 a + 10 b + c = a a a + b b b + c c c Ví d 153 = 13 + 53 + 33 in theo m i hoán v c a ch s có 18 Nh p vào m t s nguyên ng u nhiên b t k th s ó Ví d nh p vào 195 in 159, 915, 951, 519, 591 19 Cho tr c m t tháng b t k n m, cho biêt tháng thu c q ? Tháng có ngày ? Cho tr c m t ngày b t k n m dd/mm/yyyy, cho biêt s ngày k t ngày u n m 01/01/yyyy (chú ý n m nhu n) ? 20 Cho s th c x thay it n1v ib c t ng h = 0.01 Tính t ng : x3 x5 x7 + + + v i xác cho tr c, ch ng h n = 10-5 x+ MÔI TR NG VÀ C P PHÁT B 21 Viêt ch ng trình tính s 1 NH v i 201 xác 10-4 bi t r ng : cho n 2n 10 22 Cho x th c Tinh t ng : S x2 2! x4 4! 23 Cho s th c x thay x6 x 2n (2n)! 6! cho ên it c t ng h = 0.01 Hãy tính : n1v ib x 2n (2n)! 10 f (x) = e-x sin (2px) g (x) = e-2xsin (2px ) + cos (2px) 24 Cho s th c x thay i t n v i b c t ng h = 0.01 Xây d ng hàm log(a, x) tính logarit c s a c a x Dùng hàm tính giá tr c a bi u th c sau : log x (1 x ) x y= x log (x x 1) 1 25 Dãy s nguyên a0, a1, a2 an, xác nh b ng quy n p nh sau : a0 = an = n an-1 n u n ch n (n = 2, 4, ) an = n + an-1 n u n l Cho tr c n, tìm giá tr an 26 Tìm nghi m c a h ph ax + by + c = px + qy + r = ng trình : Chú ý tr v : «khơng xác nh» «ph thu c n tính» Các h s (n = 1, 3, ) n u aq - bp = n u a b c = = p q r c cho d ng danh sách (a b c p q r) 27 Cho danh sách ph ng, s vect n chi u X, Y Z : X = (x1, x2, , xn) Y = (y1, y2, , yn) Tính tích vơ h ng c a hai vect X Z, v i vect Z có thành ph n zi, i = n, xác nh nh sau : zi = n u < xi + yi< A, A > x i + yi (xi + yi)2 n u x i + yi n u x i + yi A 28 Tính a th c Hermit Hn(x) theo ph H0(x) = ng pháp s quy s l p: c 202 L P TRÌNH HÀM H1(x) = 2x Hn(x) = 2xHn-1(x) - 2(n-1)Hn-2(x) 29 Cho s th c x thay i t n v i b c t ng h = 0.01 n nguyên d ng, b ng cách s d ng c hai ph ng pháp quy l p, tính giá tr c a a th c Laguerre b c n (a = 0) c cho b i công th c truy h i nh sau : Ln+2(x) = (x 2n 3)Ln+1(x) - (n + 1)2 Ln(x) v i n = 0, 1, 2, ó : L0(x) = 1, L1(x) = x 30 Các nghi m c a ph ng trình b c ba quy v d ng t c : x3 + px + q = c tính theo cơng th c : = Arc cos( q x1 p3 27 ) A=2 p Acos x = Acos 3 c vào n nguyên d ng c p giá tr pi, qi, i = n a giá tr nghi m t ng ng x1i, x2i x3i x = Acos 31 Cho N m t s d ng, tính c n b c hai N theo ph ng pháp Newton (không s d ng hàm sqrt) N i dung ph ng pháp : N u g i s giá tr g n úng c a c n b c hai c a n N 0.5* + s giá tr g n úng h n c a N Q trình tính toán d ng l i t t i s N xác c n thi t Gi s ch n = 10 6, ó : < s M CL C CH NG V V.1 C U TRÚC D LI U 147 T V.2 P H P 147 Phép h p t p h p 149 Phép giao t p h p 149 Phép hi u c a hai t p h p 150 Tìm t p h p c a m t t p h p 150 NG N X P 150 V.2.1 V.2.2 V.2.3 V.2.4 V.2.5 V.3 T Ki u d li u tr u t ng ng n x p 151 Xây d ng ng n x p 152 Xây d ng trình so n th o v n b n 153 Ng n x p t bi n 154 Tính bi u th c s h c d ng h u t 156 158 C u trúc d li u tr u t ng ki u t p 158 Ví d áp d ng t p 159 T p t bi n 160 V.4 CAY 162 V.4.1 Cây nh phân 162 P V.3.1 V.3.2 V.3.3 V.4.1.1 Ki u tr u t ng nh phân 162 V.4.1.2 Bi u di n nh phân 164 Bi u di n ti t ki m s d ng hai phép cons 164 Bi u di n d ng y 165 Bi u di n n gi n 165 V.4.1.3 M t s ví d l p trình n gi n 166 m s l ng nút có m t 166 Tính cao c a m t 166 V.4.1.4 Duy t nh phân 167 V.4.2 C u trúc t ng quát 169 V.4.2.1 Ki u tr u t ng t ng quát 169 V.4.2.2 Bi u di n t ng quát 169 Bi u di n nh m t b ôi 169 Bi u di n n gi n qua 170 V.4.2.3 M t s ví d v t ng quát 170 m s l ng nút 170 Tính cao c a 171 V.4.2.4 Duy t t ng quát x lý trung t 171 V.4.3 ng d ng t ng quát 172 V.4.3.1 V.4.3.2 CH Xây d ng cú pháp 172 Ví d : o hàm hình th c 173 NG VI VI.1 MÔI TR MOI TR VI.1.1 VI.1.2 VI.2 C VI.2.1 VI.2.2 VI.3 VI.4 NG 177 Ph m vi t nh 178 Phép óng = bi u th c lambda + môi tr ng 179 Thay i b nh phép óng 180 Nh n bi t hàm 181 Ph m vi ng 182 Th i gian s ng c a m t liên k t 184 Mơi tr ng tồn c c 184 P PHAT B NH 185 Ví d : mơ ph ng máy tính b túi 186 Ví d : toán cân i tài kho n 187 MƠ HÌNH S VÀO/RA D VI.4.1 NH 177 M t s khái ni m 177 Ph m vi c a m t liên k t 178 VI.1.2.1 VI.1.2.2 VI.1.2.3 VI.1.2.4 VI.1.2.5 VI.1.3 VI.1.4 NG VÀ C P PHÁT B D NG MÔI TR NG 189 LI U 192 Làm vi c v i t p 192 TS Phan Huy Khạnh biãn soản 12/1999 203 204 Error! Reference source not found VI.4.2 c d li u t p 193 Các hàm c t p 193 T p v n b n 195 VI.4.3 Ghi lên t p 196 Các hàm ghi lên t p 196 L nh chép t p 197 VI.4.4 Giao ti p v i h th ng 198 ... V.2 .5 Tính bi u th c s h c d ng h u t M t bi u th c s h c th ng c vi t d i d ng trung t , ch ng h n : C U TRÚC D (9 2) * LI U 157 52 Tuy nhiên, b nh , bi u th c c bi u di n d ng (ta s xét c u trúc. .. exp))))))))) (compute postfix-expr)))) 158 L P TRÌNH HÀM (evaluation ’(9 + 52 sqrt *)) > 79.3221 V.3 T p V.3.1 C u trúc d li u tr u t ng ki u t p C u trúc d li u ki u t p (file) mô ph ng m t... t ; T o m t tài kho n m i cân i v i giá tr kh i ng trao i tài nh sau : ng 1000 (define C1 (create-account 1000)) ; Rút s ti n 100 kh i tài kho n (withdrawal! C1 100) ; Cân i l i tài kho n (balance