2016-08-25 14 views
5

Tôi đang sử dụng sách SICP nổi tiếng. Trên bài tập 1.18 một điều kỳ lạ xảy ra.Trong trường hợp cụ thể này, làm thế nào là "dấu vết" nghĩa vụ phải làm việc trong Racket?

tôi đã viết mã này:

(define (double n) (* 2 n)) 
(define (halve n) (/ n 2)) 
(define (fast-mult a b) 
    (fast-mult-iter a b 0)) 
(define (fast-mult-iter a b counter) 
    (cond ((= b 0) counter) 
      ((even? b) (fast-mult-iter (double a) (halve b) counter)) 
      (else (fast-mult-iter a (- b 1) (+ a counter))))) 

Tôi đã sử dụng các "dấu vết" chức năng.

(require racket/trace) 
(trace fast-mult) 

Tôi nghĩ "dấu vết" này sẽ hiển thị cho tôi tất cả các bước mà hàm sau cho đến khi kết quả cuối cùng. Do đó, tôi nghĩ rằng sau khi gọi

(nhanh-mult 4 3)

tôi sẽ nhận được:

> (fast-mult-iter 4 3 0) 
> (fast-mult-iter 4 2 4) 
> (fast-mult-iter 8 1 4) 
> (fast-mult-iter 8 0 12) 
< 12 

Tuy nhiên, những gì xảy ra là tôi nhận được như sau:

> (fast-mult-iter 4 3) 
< 12 

Tại sao điều này xảy ra? Tôi đã hiểu sai cách theo dõi hoạt động trong Racket?

+0

Tại sao một người nào đó đã cho tôi phiếu giảm giá? Câu hỏi của tôi có tệ không? –

+0

Meh, có lẽ chỉ là một người không thích cách bạn đặt câu hỏi. Tôi sẽ không nghĩ quá nhiều vì đó là một câu hỏi ít nhiều hay. –

Trả lời

8

Bạn đang ở rất gần. Lý do tại sao trace không cho bạn kết quả bạn mong đợi là vì bạn chỉ truy tìm fast-mult và không phải là fast-mult-iter. Nếu bạn thay đổi dòng dấu vết của bạn là:

(trace fast-mult fast-mult-iter) 

Sau đó, kết quả bạn nhận được là:

>(fast-mult 4 3) 
>(fast-mult-iter 4 3 0) 
>(fast-mult-iter 4 2 4) 
>(fast-mult-iter 8 1 4) 
>(fast-mult-iter 8 0 12) 
<12 

Đó là câu trả lời bạn mong đợi.

Các vấn đề liên quan