【发布时间】:2015-03-04 09:14:43
【问题描述】:
我是一名初学者,正在学习麻省理工学院 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)))
如果您想查看更多内容,我从here 获取。
他们正在计算使用 K 种硬币改变数量 (A) 的方法的数量 (N):
在没有第一类硬币的情况下改变 A 的方式 (X) 的数量。
改变 (A - D) 的方式 (Y) 的数量,其中 D 是第一枚硬币的面额,使用所有 K 种硬币。
问题是,我就是不明白。接下来,他们试图解释说:
“要了解为什么会这样,请观察做出改变的方式可以分为两组:不使用任何第一种硬币的方式和使用任何一种硬币的方式。因此,方式的总数找零等于不使用任何第一种硬币的情况下找零的方法的数量,加上假设我们使用第一种硬币的找零的方法的数量。(最后一句是否与加法N = X + Y 相同?) 但是后一个数字等于使用第一种硬币后剩余数量的找零方式的数量。 (使用此币后,指的是有无第一种硬币的找零方式?) "
我了解他们如何实现递归算法,但我无法看到他们是如何到达那里的。 英语不是我的母语,所以我可能会遗漏一些东西。如果您能用其他术语向我解释解决方案背后的逻辑,我将不胜感激。谢谢。
【问题讨论】:
-
以粗体表示您的第一个问题:是的。到第 2 次:用它(回复:“使用所有 K 种硬币”)。什么还不清楚?
-
@WillNess 我现在理解得更清楚了,谢谢,现在,我无法完全理解书中给我的问题中的 Y 值提供逻辑的部分:“因此,总数找零的方法数等于不使用任何第一种硬币的情况下找零的方法的数量,加上假设我们使用第一种硬币的找零的方法的数量。 但后一个数字等于使用第一种硬币后剩余金额的找零方式的数量这是为什么?我看不到它。
-
@nanameable, do use the first kind of coin 可以重述 do use at least a coin of the first kind in the same meaning.求解为(cc(-金额(第一面额种类硬币))种类硬币)))))
-
(只是为了在这里清楚地说明一半:我已经编辑了my answer,以解决上面针对我的评论)
标签: algorithm recursion scheme sicp coin-change