我正在努力解决变币问题:
给出一个数字列表k,有多少种方法可以改变给定的数量m。
作为资源之一,我有以下伪代码:
(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)))
但是我不明白这个伪代码。当它们落后时,它在前面有算术标志。我理解了else语句的开始。但是当进入else循环时,我不知道发生了什么。你可以把这个伪代码减少到在else子句之后的每一步做一些逻辑事情吗?
或者说这篇伪代码解决这个问题的文章会更有用。谷歌搜索我只发现问题,要求你给出最佳的改变,但我不需要。
注意请不要给我代码,因为这是一门课程,直接答案会违反荣誉代码。
更新 正如@EmilVikström向我解释到底发生了什么,我试图生成一个小的伪代码,应该与方案相同(这只是else子句,因为其余部分对我来说都是不言自明的)。
else
cc ( amount - kindOfCoins.head , kindOfCoins) + cc ( amount , kindOfCoins.tail )
这是由计划产生的吗? 如果不是我哪里出错了? 请再次给我答案(如果可以的话,请指出正确的方向),因为这将违反课程荣誉准则。
答案 0 :(得分:1)
这是else块的内容:
(+ (cc amount
(- kinds-of-coins 1))
(cc (- amount
(first-denomination kinds-of-coins))
kinds-of-coins))
这是Scheme,其中所有函数(包括算术运算)都是一个括号,函数名称作为第一个元素,函数的参数作为元素后面。
首先,您使用两个参数调用+
函数。为了解释的目的,我们调用参数a
和b
:
(+ a b)
a
和b
恰好都是函数调用。这是a
:
(cc amount (- kinds-of-coins 1))
和b
:
(cc (- amount ((first-denomination kinds-of-coins)) kinds-of-coins)
让我们专注于他们中的第一个,a
。 a
是cc
的函数调用,有两个参数,我们称之为x
和y
,我们有这个函数调用:(cc x y)
其中x = amount
和y = (- kinds-of-coins 1)
。所以你看到y
也是一个函数调用。
这一切都在继续。您可以查看每个括号本身并解决它的值。从最里面的括号开始(如在数学中)并向外工作。
您还需要了解cc
递归,这意味着它会调用自己来完成其工作。当代码由于其他条件为真而不再进入else
块时,它最终将停止调用自身。此停止条件称为递归的基本情况。一个好的递归函数总是在每个递归步骤(每次调用自身)时都接近它的基本情况,所以你可以确定它最终会到达它。