Chi n l c duy t cây t ng quát tìm danh sách các nút g m phép duy t theo th t tr c và phép duy t theo th t sau, khơng cĩ th t trung t .
Thu t tốn duy t cây theo th t tr c : t i m i b c đ quy, s d ng l nh append
đ t o danh sách là nút g c và k t qu duy t các cây con c a r ng :
; pre-nodes: Tree(T) → List(T)
(define (pre-nodes A)
(define (nodes-forest F) (if (null? F)
’()
(append (pre-nodes (car F))
(nodes-forest (cdr F)))))
(append (list (root A)) (nodes-forest (forest A))))
Thu t tốn duy t cây theo th t sau : t ng t phép duy t theo th t tr c nh ng phép ghép theo th t ng c l i :
; post-nodes: Tree(T) → List(T)
(define (post-nodes A) (define (nodes-forest F)
(if (null? F) '()
(append (post-nodes (car F)) (nodes-forest (cdr F)))))
Ví d cho cây A g m 11 nút s d ng ph ng pháp bi u di n cây đ n gi n qua các lá :
Hình V.13. Cây A t ng quát cĩ 11 nút
ta th c hi n hai phép duy t cây nh sau : (define A ’(1 (2 5) (3 6 7) (4 (8 (9 10 11))))) (pre-nodes A) --> ’(1 2 5 3 6 7 4 8 9 10 11) (post-nodes A) --> ’ (5 2 6 7 3 10 11 9 8 4 1) 1 2 3 4 5 6 7 8 9 10 11 V.4.3. ng d ng cây t ng quát V.4.3.1. Xây d ng cây cú pháp
Cây cú pháp là cây t ng quát sao cho giá tr g n cho m i nút xác đnh đ c s l ng các con c a nút đĩ. S nút này cĩ th c đnh ho c thay đ i tuy theo tr ng h p v n d ng. Ch ng h n m t ch ng trình Scheme đúng đ n chính là m t cây cú pháp.
Trong quá trình phân tích cú pháp (đ biên d ch mã ngu n thành mã đích), ng i ta s d ng m t b ng d li u l u gi thơng tin liên quan đ n phép tốn và tham s t ng ng. B ng này cung c p các c p giá tr g m nút và s l ng các cây con t ng ng đ ki m tra tính đúng đ n c a bi u th c.
Thơng th ng ng i ta s d ng các giá tr nút d ng nguyên t (atom). Ng i ta th ng u tiên s d ng cách bi u di n đ n gi n cây t ng quát qua các lá. Khi bi t đ c s l ng các con c a m t nút, ng i ta dùng các phép tốn ti p c n đ n cây con th n, ti p c n đ n các phép tốn c s , c ng nh ti p c n đ n các c u trúc d li u đã đ c đnh ngh a trong mã ngu n.
Sau đây là m t s đ nh ngh a hàm t o các cây cú pháp : ; nh ngh a cây ch g m m t nút
(define (create0 E) E) ; Cây g m m t nút và m t cây con
(define (create1 E A) (list E A)) ; Cây g m m t nút và hai cây con
(define (create2 E A1 A2) (list E A1 A2)) v.v ...
(define son1 cadr)
; Hàm tr v cây con th hai v i đi u ki n cây đã cho cĩ t i thi u 2 con (define son2 caddr)
; Hàm tr v cây con th ba v i đi u ki n cây đã cho cĩ t i thi u 3 con (define son3 cadddr)
v.v ...
Ch ng h n xây d ng cây cú pháp cho bi u th c Scheme (define L (list ’ann ’tom ’bob))
nh sau :
(define T
(create2 ’define ’L (create3 ’list ’ann ’tom ’bob))) T
--> ’(define L (list ann tom bob)) (son2 (son2 T))
--> ’tom
Hình V.14. Cây nh phân bi u di n bi u th c Scheme.
define
L list
’ann ’tom ’bob
V.4.3.2. Ví d : đ o hàm hình th c
D i đây là th t c tính đ o hàm c a m t bi u th c. Cây t ng quát bi u di n bi u th c cĩ quy c nh sau : các lá g m s nguyên và ký hi u bi u di n các bi n hình th c, các nút trong là các phép tốn. Trong ví d này, đ đ n gi n, ch xét phép c ng và phép nhân.
; type Varable = Symbol
; type Operator = {+, *}
; type Exp = Tree(Integer ∪ Variable ∪ Operator)
; Chú ý : ki u Exp cĩ th mơ t c th h n nh sau :
;type Exp = Integer ∪ Variable ∪ Operator × Exp × Exp
;derivative : Exp × Variable → Exp
; Th t c tr v đ o hàm c a Eđ i v i bi n V
(define (derivative E V) (cond
((leaf? E)
(if (eq? (root E) V) 1 0)) ((eq? (root E) ’+)
(create2 ’+ (derivative (son1 E) V) (derivative (son2 E) V))) ((eq? (root E) ’*)
(create2 ’+(create2 ’* (derivative (son1 E) V) (son2 E)) (create2 ’* (son1 E)
(derivative (son2 E) V)))) (else
(error ”unknown operator” (root E))))) (derivative ’(+ x (* 2 y)) ’y)
--> (+ 0 (+ (* 0 y)(* 2 1))) (derivative ’(+ (* -3 x x) (* 2 x) 1) ’x) --> (+ (+ (* 0 x) (* -3 1)) (+ (* 0 x) (* 2 1))) (derivative '(* 2 x) 'x) --> (+ (* 0 x) (* 2 1)) Bài t p ch ng 5 1. Cho tr c m t đnh ngh a hàm nh sau : (define (less k x) (cond ((null? x) ’())
((< (car x) k) (cons (car x) (less k (cdr x)))) (else (less k (cdr x)))))
Hãy cho bi t giá tr tr v c a các l i g i sau đây, gi i thích t i sao : (less 5 ’())
(less 5 ’(4 5 6)) (less 5 ’(7 3 6 2))
Vi t l i hàm trên nh ng ch s d ng if mà khơng s d ng cons, đ ng th i lo i b bi u th c th a (less k (cdr x)) ?
2. Vi t hàm chuy n đ i các s nh phân (h c s 2) ra th p phân (h c s 10) và ng c l i (chú ý các tham bi n là các s nguyên) theo g i ý nh sau :
(binary->decimal 10001) --> 17
(decimal->binary 17) --> 10001
3. Vi t hàm chuy n đ i c s đ tr v k t qu là hàm chuy n đ i các s nh phân ra th p phân và ng c l i theo g i ý nh sau (cĩ th đnh ngh a các hàm b tr ) :
((base-converse 2 10) 10001) --> 17
((base-converse 10 2) 17) --> 10001
4. Vi t hàm (converse P N) chuy n đ i s th p phân N b t k sang s h c s P, v i
(converse 16 17) --> 11 (converse 8 17) --> 21 (converse 2 17) --> 10001 5. Xây d ng c u trúc d li u ki u ng n x p đ t bi n nh ng cĩ kích th c gí i h n, ngh a là s ph n t c a ng n x p khơng v t quá MaxNum. Cĩ th bi u di n ng n x p b i m t vector, trong đĩ s d ng m t s nguyên làm ch s đnh c a ng n x p.
6. Xây d ng hàm tính bi u th c s h c d ng h u t s d ng ng n x p thơng th ng.
7. T cách s d ng k thu t truy n thơng đi p đ xây d ng các hàm x lý ng n x p trong lý thuy t, hãy vi t thêm các hàm cho phép đ a ra xem n i dung c a ng n x p v i thơng
đi p view-content.
8. Vi t l i hàm nodes khơng s d ng l nh appendđ tr v danh sách t t c các nút c a cây nh phân.
9. Vi t các thu t tốn duy t cây nh phân theo chi u r ng. 10.Vi t các thu t tốn duy t cây nh phân theo chi u sâu.
11.Trong m t nhà ga, ng i ta c n s p x p các toa tàu trên các đ ng ray nh hình v d i đây. S d ng m t ng n x p đ bi u di n ho t đ ng s p x p các toa tàu trên các đ ng ray, hãy cho bi t các thao tác c n ph i th c hi n sao cho các toa tàu đ c s p x p theo th t 5 4 3 2 1 ? 4 1 R1 R2 2 3 5
Hình V.15. S p x p theo th t các toa tàu trên các đ ng ray.
12.Xây d ng hàm (pairlis L1 L1 alist)đ tr v m t danh sách k t h p b ng cách thêm vào đ u c a alist các b đơi nh n đ c t các c p ph n t l y t L1 và L2 l n l t t ng ng (gi thi t L1 và L2 cĩ cùng đ dài).
(pairlis ’(1 2) (one two) ’((3 . three) (4 . four))) --> ((1. 0ne) (2. two) (3. three) (4. four))
13.Xây d ng hàm modivalđ làm thay đ i giá tr k t h p v i m t khĩa thành giá tr m i, hay thêm m i m t b đơi n u khĩa đã cho khơng tìm th y trong m t danh sách k t h p đã cho.
14.T danh sách các s th c X1, Y1, X2, Y2, X3 t ng ng l n l t là to đ c a ba đi m A, B, C trong m t m t ph ng to đ . Hãy cho bi t ba đi m A, B, C cĩ t o thành m t tam giác cân, đ u, vuơng, th ng hay suy bi n (di m đ ng th ng) ?
15.T danh sách 8 s th c X1, Y1, X2, Y2, X3, Y3, X4, Y4 l n l t là to đ c a b n đi m A, B, C, D t ng ng trong m t m t ph ng to đ . Hãy cho bi t ba đi m A, B, C cĩ l p thành m t tam giác khơng ? N u ABC là m t tam giác, hãy xét xem :
1. i m D cĩ n m bên trong tam giác này khơng ? 2. Tính di n tích và chu vi c a tam giác
3. Tính kho ng cách t Dđ n ba đi m A, B, C.
16.Trong m t ph ng to đ , ph ng trình đ ng d c c a m t đ ng th ng cĩ đ d c m và đi qua đi m P cĩ to đ (x1, y1) là : y - y1 = m(x - x1). T danh sách g m đ d c và to đ đi m c a hai đ ng th ng, hãy ki m tra xem chúng cĩ giao nhau hay song song v i nhau. N u chúng cĩ giao nhau, ki m tra chúng cĩ vuơng gĩc v i nhau hay khơng ?
17.T m t s th c d ng R và m t s nguyên d ng MAX, hãy tìm m t phân s g n s R
nh t trong s các phân s cĩ d ng P/Q v i Q≤MAX ?
18.Cho m t ma tr n các s nguyên N×N ph n t gi s đ c bi u di n d i d ng m t danh sách g m N ph n t là các danh sách con, m i danh sách con bi u di n m t hàng N ph n t , liên ti p hàng n n i ti p hàng kia. Hãy xét xem ma tr n đã cho cĩ là ma tr n gì : a) Ma tr n tam giác trên-ph i (cĩ các ph n t n m phía d i đ ng chéo chính b ng 0) ? b)Ma tr n tam giác d i-ph i (cĩ các ph n t n m phía trên đ ng chéo chính b ng 0) ? c) Ma tr n tam giác trên-trái (cĩ các ph n t n m phía d i đ ng chéo ph b ng 0) ? d)Ma tr n tam giác d i-trái (cĩ các ph n t n m phía trên đ ng chéo ph b ng 0) ? e) Ma tr n đ y đ (khơng r i vào m t trong 4 tr ng h p tam giác trên) ?
CH NG VI. MƠI TR NG VÀ C P PHÁT B NH
h ng này t p trung nghiên c u các khái ni m ph m vi (scope) và t m nhìn (visibility) c a các bi n trong khi th c hi n ch ng trình. Ta s s d ng b nh đ mơ hình hĩa m i liên k t (link) gi a bi n và giá tr c a bi n qua l nh gán bi n b i set!. Ta s nghiên c u khái ni m c ch đĩng (closure) trong m i liên h v i d ng set! và trình bày cách v n d ng d ng l nh liên k t bi n letrec.
T khái ni m bi n đ t bi n (bi n thay đ i giá tr m t cách b t th ng) đã xét, ta đi đ n khái ni m nguyên m u (protype). ây là khái ni m v t h p các c ch đĩng và gán
(assignment) đ đĩng gĩi (encapsulation) các tr ng thái c a m t c u trúc ph c h p và các x lý trên đĩ, t ng t khái ni m l p đ i t ng trong l p trình h ng đ i t ng.
C
VI.1 Mơi tr ng
VI.1.1. M t s khái ni m
Ta xem xét các quy t c th hi n m i liên k t gi a m t bi n và giá tr c a nĩ. Bi n là tên g i đ ch đnh đ n m t giá tr , hay liên k t v i m t v trí ch a giá tr trong b nh (bound occurrence). Liên k t m t bi n v i m t giá tr đ c hình thành khi tính m t bi u th c ki u liên k t, ngh a là m t bi u th c s d ng m t trong các d ng let, let*, letrec, do,
define, ho c khi g i hàm, ho c khi s d ng phép tính lambda.
Khi g i hàm, ho c th c hi n phép tính lambda, các tham bi n hình th c đ c liên k t v i (đ c truy n) các giá tr tham đ i th c s t ng ng.
Khi m t bi u th c đ c tính, câu h i đ t ra là : giá tr nào s gán cho bi n ? Giá tr này cĩ th tùy thu c vào ph m vi c a bi n trong đo n ch ng trình và vào th i gian s ng (lifetime hay extend) c a bi u th c đang tính. mơ t t p h p các liên k t gi a bi n đang ho t đ ng cĩ th ti p c n và giá tr c a chúng, ng i ta đ a vào khái ni m mơi tr ng (environment). Mơi tr ng đ c xem là m t dãy các kh i liên k t. Liên k t c a m t bi n là giá tr gán cho bi n trong mơi tr ng.
Ch ng h n, khi tính bi u th c v i d ng let trong m t ng c nh nào đĩ, m t mơi tr ng hi n hành đ c hình thành. D ng let cĩ cú pháp nh sau (xem ch ng 2) :
(let ((x1 e1)
...
(xn eN))
body)
u tiên, các bi u th c e1, ..., eN đ c tính đ ng th i trong mơi tr ng hi n hành đ nh n đ c các giá tr v1,..., vN. t ng ng. Sau đĩ, thân c a letđ c tính trong mơi tr ng m i nh n đ c b ng cách thêm các kh i liên k t x1→v1, ..., xN→vN vào mơi tr ng hi n hành nh hình d i đây :
Mơi tr ng hi n hành c a let Mơi tr ng c a thân c a let
y1 w1
... ...
xN vN
... ...
x1 v1
Hình VI.1. Mơi tr ng hi n hành c a d ng let. Ví d trong l nh gán :
(let ((x (+ 1 2))) (* x x))
thì bi n x đ c liên k t v i 3. Trên đây, ta th y r ng quan h gi a m t bi n và giá tr c a nĩ khơng th gi i thích mà khơng nĩi đ n b nh (memory). Vi c đ a vào l nh gán đã làm thay đ i khái ni m ban đ u v mơi tr ng.
M t mơi tr ng khơng ch ra giá tr c a m t bi n n a mà ch ra đa ch c a nĩ trong b nh . Ngh a là, giá tr c a m t bi n ph thu c vào hai hàm :
• Hàm k t h p m t bi n v i m t v trí nh đ c g i là mơi tr ng.
• Hàm k t h p m t v trí nh c a bi n v i m t giá tr ch a trong đĩ, g i là b nh . Giá tr c a bi n x đ c cho b i vi c t h p các hàm này :
(memory (environmet x)) Ta cĩ s đ nh sau :
Hình VI.2. Ph thu c c a bi n vào mơi tr ng và b nh .
Mơi tr ng B nh x
a ch c a x
giá tr c a x
VI.1.2.Ph m vi c a m t liên k t
Trong Scheme, ph m vi c a m t liên k t cịn đ c g i là vùng (region). Ph m vi là t nh
(static scope) n u nĩ khơng ph thu c vào vi c th c hi n ch ng trình. Trong tr ng h p ng c l i, ng i ta g i ph m vi là đ ng (dynamicscope). M t mơi tr ng mà khơng x y ra các phép liên k t bi n đ c g i là mơi tr ng m c đnh (top level environment). Sau đây ta s xét k h n v hai khái ni m ph m vi t nh và ph m vi đ ng.
VI.1.2.1. Ph m vi t nh
(let ((a 5))
(let ((f ((lambda (x) (+ a x))) (a 0))
(f 10)) ; thân let trong
) --> 15
Khi tính, bi n a là nhìn th y đ c trong thân c a let ngồi, cịn hàm f là nhìn th y đ c trong thân c a let trong. Thân c a let trong c ng là mơi tr ng c a hàm f. V n đ đ t ra là vì sao giá tr c a bi u th c tính đ c b ng 15 mà khơng b ng 10 ?
Trong đnh ngh a hàm f, ta th y (f 10) th c hi n vi c thêm 10 vào giá tr c a a, nh ng là giá tr nào c a a ?
- T i th i đi m đnh ngh a f, thì a = 5 ? - T i th i đi m g i f, thì lúc này a = 0 ?
Trong Scheme, ng i ta s d ng giá tr c a a nhìn th y đ c t i th i đi m đnh ngh a f. Vi c l a ch n này đ c g i là ph m vi t nh, cịn n u l a ch n giá tr t i th i đi m g i hàm thì đ c g i là ph m vi đ ng. V y câu tr l i là 15. i v i các đnh ngh a m c đnh, ng i ta c ng s d ng nguyên t c nh v y. Ta xét ch u làm vi c sau : (define b 10) ; b là bi n tồn c c (define (f x) (* b x)) ;b=10 trong mơi tr ng c a đnh ngh a f (f 5) --> 50 ;f nh n đ c giá tr c a b
(let ((b 0)) ;b khơng đ c nhìn th y khi g i f
(f 5)) ;fđ c g i và ch nhìn th y b tồn c c
--> 50
Ngh a là giá tr c a b t i th iđi m đnh ngh a f đã đ c s d ng đ tính trong thân hàm.
VI.1.2.2. Phép đĩng = bi u th c lambda + mơi tr ng
Khi xét ph m vi t nh c a bi n, ta đ a vào khái ni m bi n t do (free occrence) là bi n xu t hi n trong m t bi u th c nh ng khơng đ c liên k t giá tr . Ví d bi u th c :
(lambda (x) (lambda (y) (+ x y a)))
ch a các bi n t do là a và +, các bi n liên k t là x và y. Cùng m t bi n cĩ th v a là bi n liên k t v a là bi n t do. Ví d , trong bi u th c sau, x v a là m t liên k t, v a là m t bi n t