我是一名初学者,学习麻省理工学院 OpenCourseWare 上的 SICP 课程,同时使用视频讲座和在线书籍。昨天我遇到了一个例子,它询问我们是否可以编写一个程序来计算改变任何给定金额的方法的数量。
这个问题有一个简单的递归过程解决方案:
(define (count-change amount)
(cc amount 5))
(define (cc amount kinds-of-coins)
(cond ((= amount 0) 1)
((or (< amount 0) (= kinds-of-coins 0)) 0)
(else (+ (cc amount
(- kinds-of-coins 1))
(cc (- amount
(first-denomination kinds-of-coins))
kinds-of-coins)))))
(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)))
如果你想查看更多,我从这里拿走了。
他们正在计算使用 K 种硬币改变数量 (A) 的方法的数量 (N),方法是添加:
在没有第一类硬币的情况下改变 A 的方式数 (X)。
改变 (A - D) 的方式 (Y) 的数量,其中 D 是第一枚硬币的面额,使用所有 K 种硬币。
问题是,我只是不明白这一点。接下来,他们试图解释说:
“要了解为什么这是真的,请观察做出改变的方式可以分为两组:不使用任何第一种硬币的那些,以及使用任何一种硬币的那些。因此,做出改变的方式的总数for some amount 等于不使用任何第一种硬币的金额的找零方式的数量,加上假设我们使用第一种硬币的找零方式的数量。(是最后一句与加法相同 N = X + Y ?)但后一个数字等于使用第一种硬币后剩余金额的找零方式的数量。(使用此硬币后,他们指的是方式用或不用第一种硬币找零?) ”
我了解他们如何实现递归算法,但我无法看到他们是如何到达那里的。英语不是我的母语,所以我可能会遗漏一些东西。如果您能用其他术语向我解释解决方案背后的逻辑,我将不胜感激。谢谢。