2016-08-25 4 views
5

나는 유명한 책 SICP를 사용하고 있습니다. 운동 1.18에서 이상한 일이 일어난다. 나는 "추적"기능을 사용하고 있었다이 구체적인 경우 라켓에서 "추적"이 어떻게 작동해야합니까?

(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))))) 

:

는이 코드를 썼다.
(require racket/trace) 
(trace fast-mult) 

나는이 "추적"모든 기능이 최종 출력까지 다음 단계를 나에게 보여 거라 생각 했어요. 따라서, 나는 생각했다 그 호출 한 후

내가 얻을 것이다 (빠른 멀티 포트 4 3)

:

> (fast-mult-iter 4 3) 
< 12 
그러나

> (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 

를, 무슨 일 나는 다음과 같은 얻을 수 있다는 것입니다

왜 이런 일이 발생합니까? 나는 라켓에서 추적이 어떻게 작동하는지 오해 했습니까?

+0

왜 누군가 내게 downvote를 주었습니까? 내 질문이 나쁜가요? –

+0

맙소사, 아마도 당신이 질문 한 방식을 좋아하지 않는 사람 일 겁니다. 나는 그것이 더 많거나 적은 훌륭한 질문이기 때문에 너무 많이 생각하지 않을 것이다. –

답변

8

아주 가까이 있습니다. trace이 예상 결과를 제공하지 않는 이유는 fast-mult 만 추적하고 fast-mult-iter이 아니기 때문입니다. 당신이 당신의 추적 선을 수정하는 경우가 될 수 있습니다 :

(trace fast-mult fast-mult-iter) 

그런 다음 당신이 얻을 결과는 다음과 같습니다

>(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 

당신이 기대하는 답이된다.