2016-08-25 54 views
5

Ünlü kitap SICP'yi kullanıyorum. 1.18 egzersizinde tuhaf bir şey olur. Ben "iz" fonksiyonu kullanılarak yapıldıBu somut durumda, Racket'te "iz" in nasıl çalışması gerekiyor?

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

:

Bu kodu yazdım.

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

Bu "trace", işlevin son çıktıya kadar izlediği tüm adımları göstereceğini düşündüm. Dolayısıyla, ben düşündüm çağrıldıktan sonra

Ben alacağı (hızlı-mult 4 3)

:

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

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

ne olur aşağıdaki alıyorum olmasıdır

Bu neden oluyor? Racket'te eserlerin nasıl çalıştığını yanlış anladım mı?

+0

Neden birisi bana bir downvote verdi? Sorumum kötü mü? –

+0

Meh, muhtemelen sadece soruyu sorma şeklini beğenmeyen biri. Az ya da çok iyi bir soru olduğu için fazla düşünmezdim. –

cevap

8

Çok yakınsınız. trace'un neden beklediğiniz sonucu vermemesinin nedeni, yalnızca fast-mult ve fast-mult-iter değil. Eğer iz çizgisini değiştirirseniz olmak:

(trace fast-mult fast-mult-iter) 

Sonra olsun sonucudur:

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

beklediğiniz cevabı da bu.