5 lisp scheme functional-programming sicp 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)))))
Run Code Online (Sandbox Code Playgroud)
我正在使用"跟踪"功能.
(require racket/trace)
(trace fast-mult)
Run Code Online (Sandbox Code Playgroud)
我认为这个"跟踪"会向我显示函数所遵循的所有步骤,直到最终输出.因此,我打电话后想到了
(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
Run Code Online (Sandbox Code Playgroud)
然而,发生的是我得到以下内容:
> (fast-mult-iter 4 3)
< 12
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我是否误解了Racket中跟踪的工作原理?
你很近.之所以trace没有给你预期的结果,是因为你只跟踪fast-mult,而不是fast-mult-iter.如果您将跟踪线修改为:
(trace fast-mult fast-mult-iter)
Run Code Online (Sandbox Code Playgroud)
然后你得到的结果是:
>(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
Run Code Online (Sandbox Code Playgroud)
你期望的答案是什么?