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?
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? –
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. –