伪代码成逻辑步骤?

时间:2014-05-07 07:14:52

标签: 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
                     (- 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 )

这是由计划产生的吗? 如果不是我哪里出错了? 请再次给我答案(如果可以的话,请指出正确的方向),因为这将违反课程荣誉准则。

1 个答案:

答案 0 :(得分:1)

这是else块的内容:

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

这是Scheme,其中所有函数(包括算术运算)都是一个括号,函数名称作为第一个元素,函数的参数作为元素后面。

首先,您使用两个参数调用+函数。为了解释的目的,我们调用参数ab

(+ a b)

ab恰好都是函数调用。这是a

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

b

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

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

这一切都在继续。您可以查看每个括号本身并解决它的值。从最里面的括号开始(如在数学中)并向外工作。

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