在这个具体案例中,"trace" 应该如何在 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)))))
我正在使用 "trace" 函数。
(require racket/trace)
(trace fast-mult)
我认为这个 "trace" 会向我展示函数在最终输出之前遵循的所有步骤。因此,我认为在调用
(快乘 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
为什么会这样?我是否误解了 trace 在 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
这是您期望的答案。
我用的是名著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)))))
我正在使用 "trace" 函数。
(require racket/trace)
(trace fast-mult)
我认为这个 "trace" 会向我展示函数在最终输出之前遵循的所有步骤。因此,我认为在调用
(快乘 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
为什么会这样?我是否误解了 trace 在 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
这是您期望的答案。