2016-08-25 58 views
5

Używam słynnej książki SICP. W ćwiczeniu 1.18 dzieje się dziwna rzecz.W tym konkretnym przypadku, w jaki sposób "ślad" ma działać w Rakiecie?

Napisałem ten kod:

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

używałem funkcji "śledzenia".

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

Myślałem, że ten "ślad" pokaże mi wszystkie kroki, które funkcja spełnia, aż do końcowego wyniku. Dlatego pomyślałem, że po wywołaniu

(fast-mult 4 3)

chciałbym uzyskać:

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

Jednak to, co się dzieje, że mam następujące:

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

Dlaczego tak się dzieje? Czy źle zrozumiałem, jak działa ślad w Rakiecie?

+0

Dlaczego ktoś dał mi zniżkę? Czy moje pytanie jest złe? –

+0

Meh, to pewnie ktoś, kto nie lubi sposobu, w jaki zadałeś to pytanie. Nie zastanawiałbym się nad tym zbytnio, ponieważ jest to mniej lub bardziej delikatne pytanie. –

Odpowiedz

8

Jesteś bardzo blisko. Powodem, dla którego trace nie daje oczekiwanego rezultatu, jest śledzenie tylko fast-mult, a nie fast-mult-iter. Jeśli zmodyfikować linię śledzenia być:

(trace fast-mult fast-mult-iter) 

Następnie wynik można uzyskać to:

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

Jaka jest odpowiedź można się spodziewać.