2014-05-07 93 views
2

我试图解决硬币变化问题:将伪代码转换为逻辑步骤?

鉴于数,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子句之后的每一步都要做的逻辑事项?

或者什么文章会更有用,这个伪代码解决了这个问题。谷歌搜索这个我只发现问题,让你给最佳的变化,但我不需要。

注意请不要给我的代码,因为这是一个coursera课程,直接的答案会违反荣誉代码。

UPDATE 作为@EmilVikström亲切地对我解释,究竟是怎么回事在那里我试图产生一个小的伪代码应该是一样的方式(这仅仅是else子句作为休息甚至对我来说也是不言自明的)。

else 
    cc (amount - kindOfCoins.head , kindOfCoins) + cc (amount , kindOfCoins.tail) 

这是从方案产生的东西吗? 如果不是我哪里出错了? 请再次不要给我答案(只要指出我的方向正确,如果可以的话),因为这会违反课程的荣誉代码。

+0

这看起来像Scheme代码。 “前面的算术符号”仅仅意味着“对这两个参数应用'+'函数”。 –

+0

这是计划。是的,它有前面的算术符号。如果教师希望你了解Scheme,他们应该指出你一些教程或其他。实际上,您*有*代码,并且您要求我们对其进行解码。 –

+0

@EmilVikström怎么样 - 在再次调用cc的return子句中签名?我可以从你所说的话中推断出cc的数量加上了某些东西。我认为这是一个列表。然而,这是有道理的,我认为这份清单并不完整。如果列表包含除第一个元素之外的所有元素。是这样吗?最后一件事。 return子句是两个cc函数的补充吗? – Bula

回答

1

这是别的块的内容:

(+ (cc amount 
     (- kinds-of-coins 1)) 
    (cc (- amount 
      (first-denomination kinds-of-coins)) 
     kinds-of-coins)) 

这是方案,其中所有的功能,包括算术运算,是与函数名作为第一元素的括号和函数的自变量作为元素之后。

首先你打电话给带有两个参数的+函数。让我们调用的参数ab对于这种解释的目的:

(+ a b) 

两个ab碰巧是函数调用。这里是a

(cc amount (- kinds-of-coins 1)) 

b

(cc (- amount ((first-denomination kinds-of-coins)) kinds-of-coins) 

让我们专注于他们的第一,a。我们称之为xy,并且我们有这个函数调用:(cc x y)其中x = amounty = (- kinds-of-coins 1)cc的函数调用。所以你看到y也是一个函数调用。

然后继续。您可以自己查看每个括号并解决它的价值。从最内括号开始(如数学)并向外发展。

您还需要了解cc递归,这意味着它调用自身来完成工作。当代码由于其他条件成立而不再进入else模块时,它最终会停止自行调用。该停止条件称为递归的基本情况。一个好的递归函数总是在每个递归步骤(每次它自己调用时)都更接近它的基本情况,所以你可以确定它最终会达到它。

+0

谢谢你的解释。我试图从else子句中解读该方案。你能告诉我,如果我说得对吗?我感谢你的帮助(检查更新) – Bula