繁体   English   中英

在这个具体案例中,“跟踪”应该如何在Racket中运行?

[英]In this concrete case, how is “trace” supposed to work in Racket?

我正在使用着名的书籍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 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

然而,发生的是我得到以下内容:

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

为什么会这样? 我是否误解了Racket中跟踪的工作原理?

你很近。 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

你期望的答案是什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM