2016-08-25 6 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) 

私は、この「トレース」が最終出力まで関数が従うすべてのステップを表示すると思っていました。しかし、何が起こることは、私は次のことを得ることである

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

を::

> (fast-mult-iter 4 3) 
< 12 
したがって、私は

(3 4高速MULT)

を呼び出した後、私はなるだろうと思いました

なぜこれが起こりますか?私はラケットのトレースがどのように機能するのか誤解しましたか?

+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 

関連する問題