我修改了count-change
SICP 中函数的代码,以便在函数递归时显示一对。该对的形式为"(cc a k)" -> "(cc a (- k 1))"
or "(cc a k)" -> "(cc (- a (d k)) k)"
,我的目标是构建一个 DOT 文件以使用 GraphViz 显示树递归。
这是一个示例图像,由以下代码生成:
这是方案代码:
; Count Change
(define (count-change amount)
(cc amount 5))
(define (cc amount kinds-of-coins)
(begin
(cond ((= amount 0) 1)
((or (< amount 0) (= kinds-of-coins 0)) 0)
(else (+
(begin
(display "\"")
(display `(cc ,amount ,kinds-of-coins))
(display "\"")
(display " -> ")
(display "\"")
(display `(cc ,amount ,(- kinds-of-coins 1)))
(display "\"")
(display "\n")
(cc amount (- kinds-of-coins 1))
)
(begin
(display "\"")
(display `(cc ,amount ,kinds-of-coins))
(display "\"")
(display " -> ")
(display "\"")
(display `(cc ,(- amount (first-denomination kinds-of-coins)) ,kinds-of-coins))
(display "\"")
(display "\n")
(cc (- amount (first-denomination kinds-of-coins)) kinds-of-coins)
)
)
))))
; first-denomination takes the number of kinds of coins and returns the denomination of the first kind
(define (first-denomination kinds-of-coins)
(cond ((= kinds-of-coins 1) 1)
((= kinds-of-coins 2) 5)
((= kinds-of-coins 3) 10)
((= kinds-of-coins 4) 25)
((= kinds-of-coins 5) 50)))
(count-change 11)
原始代码在这里。
我已经阅读了有关方案宏的信息,我认为它们可以通过允许我在begin
带有显示的语句中“包装”对 (cc . .) 的调用来解决这个问题,以输出递归时发生的情况。
如何使用 Scheme 宏来做到这一点?
注意:我知道我的图像不准确,我需要找到一种使节点不同的方法,以便图是一棵树,而不仅仅是一个 DAG。但是,这超出了这个问题的范围。