Scheme 方案展开过程调用

Scheme 方案展开过程调用,scheme,Scheme,给定一个函数,比如fibonacci递归的树递归实现,我如何显示表达式求值的每个步骤,比如(fib 5) 例如,我想输出: (fib 5) (+ (fib 4) (fib 3)) (+ (+ (fib 3) (fib 2)) (+ (fib 2) (fib 1))) (+ (+ (+ (+ (fib 1) 0) (fib 1) (+ (fib 1) 0)) (+ (+ (fib 1) 0) (fib 1))) (+ (+ (+ (+ 1 0) 1 (+ 1 0)) (+ (+ 1 0)

给定一个函数,比如fibonacci递归的树递归实现,我如何显示表达式求值的每个步骤,比如
(fib 5)

例如,我想输出:

(fib 5)

(+ (fib 4) (fib 3))

(+ (+ (fib 3) (fib 2)) (+ (fib 2) (fib 1)))

(+ (+ (+ (+ (fib 1) 0) (fib 1) (+ (fib 1) 0)) (+ (+ (fib 1) 0) (fib 1)))

(+ (+ (+ (+ 1 0) 1 (+ 1 0)) (+ (+ 1 0) 1))
我知道使用quasiquoting可以对表达式进行部分求值,如下所示:

`(+ ,(* 3 4) (- 0.1 2))   ; evaluates to -┐
(+ 12 (- 0.1 2))          ;          <----┘
`(+,(*34)(-0.12));评估为-┐
(+ 12 (- 0.1 2))          ;           你是说,像这样

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else `(+ ,(fib (- n 1))
                  ,(fib (- n 2))))))
例如:

(fib 5)
=> '(+ (+ (+ (+ 1 0) 1) (+ 1 0)) (+ (+ 1 0) 1))

当然,上面只返回评估的最终结果。使用内置的步进器(如Racket中的步进器),您可以看到每个中间步骤。要了解一下这一点,恰巧它也显示了斐波那契函数。

啊,我在错误的位置进行了拟液化,我一直在程序体之外使用它。非常感谢。我得去看看球拍,它看起来很酷。我想做的是生成一个树可视化,如SICP的第68页。如果我使用GraphViz,那么我只需要输出父子对,比如“(fib 3)->(fib 2)”,“(fib 3)->(fib 1)”,然后使用
dot
将其渲染为PNG。我可以将每个函数调用包装在(begin(display…)语句中。
(fib 5)
=> '(+ (+ (+ (+ 1 0) 1) (+ 1 0)) (+ (+ 1 0) 1))