Duy t cây t ng quát khơng cĩ x lý trung t

Một phần của tài liệu Tài liệu Cấu trúc dữ liệu_chương 5 docx (Trang 27)

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 L1L2 l n l t t ng ng (gi thi t L1L2 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 QMAX ?

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 x1v1, ..., xNvN 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

Một phần của tài liệu Tài liệu Cấu trúc dữ liệu_chương 5 docx (Trang 27)

Tải bản đầy đủ (PDF)

(60 trang)