Scheme 方案展开过程调用
给定一个函数,比如fibonacci递归的树递归实现,我如何显示表达式求值的每个步骤,比如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)
(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))