Syntax 将伪代码转换为逻辑步骤?
我试图解决硬币兑换问题: 给定一个数字k的列表,有多少种方法可以改变给定的数量m 作为资源之一,我有以下伪代码:Syntax 将伪代码转换为逻辑步骤?,syntax,scheme,infix-notation,coin-change,prefix-notation,Syntax,Scheme,Infix Notation,Coin Change,Prefix Notation,我试图解决硬币兑换问题: 给定一个数字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
(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)))
这就是这个计划的结果吗?
如果不是的话,我错在哪里了?
请再次不要给我答案(如果可以的话,请给我指出正确的方向),因为这将违反coursera荣誉守则 这是else块的内容:
(+ (cc amount
(- kinds-of-coins 1))
(cc (- amount
(first-denomination kinds-of-coins))
kinds-of-coins))
这是一种方案,其中所有函数(包括算术运算)都是一个括号,函数名作为第一个元素,函数的参数作为后面的元素
首先,使用两个参数调用+
函数。为了便于解释,让我们调用参数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=(-硬币种类1)
。您可以看到,y
也是一个函数调用
这样下去。您可以查看每个括号本身并解析其值。从最里面的括号开始(如在数学中),向外展开
您还需要了解
cc
是递归的,这意味着它调用自己来完成工作。当代码由于其他条件为真而不再进入else
块时,它将最终停止调用自己。这种停止条件称为递归的基本情况。一个好的递归函数在每个递归步骤中(每次调用自己时)都会更接近它的基本情况,因此您可以确定它最终会到达它。这看起来像是方案代码。“前面的算术符号”仅表示“将+
函数应用于这两个参数”。这是一个Scheme。是的,它前面有算术符号。如果老师想让你理解这个计划,他们应该给你指一些教程或其他。实际上,您拥有代码,并且您要求我们对其进行反编码。@EmilVikström在再次调用cc的return子句中的-sign如何?我可以从你所说的推断出cc是指数量加上一些东西。我认为这是一个列表。不过,我相信这是有道理的,因为清单并不完整。如果列表包含除第一个元素以外的所有元素。是这样吗?最后一件事。return子句是两个cc函数的一个附加项吗?谢谢您的解释。我试图从else条款中破译这个计划。你能告诉我我做对了吗?感谢您的帮助(查看更新)
(cc (- amount ((first-denomination kinds-of-coins)) kinds-of-coins)