数改变SICP

时间:2017-01-24 09:30:34

标签: scheme lisp sicp

我正在阅读SICP并遇到问题,在第1章中有一个名为计数更改的示例,我需要在方案中编写一个程序来计算更改任何给定数字的方法的可能数量 - 美元,宿舍,角钱,尼克和便士。 这本书展示了一个程序的替代模型,我试图把它改成一个嵌套的但却失败了,有人能给我一个忙吗?

(define (count_change total_amount)

    (define (denomination kinds_of_coins)
        (cond ((= kinds_of_coins 5) 50)
              ((= kinds_of_coins 4) 25)
              ((= kinds_of_coins 3) 10)
              ((= kinds_of_coins 2) 5)
              ((= kinds_of_coins 1) 1)))

    (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 (denomination kinds_of_coins)) kinds_of_coins))))

    (cc total_amount 5))

执行结果如下:

;Ill-formed clause: 1

1 个答案:

答案 0 :(得分:1)

cond表达式通常采用(cond (predicate expr) ... (else expr))(cond (predicate expr) ... (#t expr))的形式。每当谓词的计算结果为true时,子句中的对应表达式就是条件表达式的结果。如果最后没有else / #t谓词且条件表达式上的所有谓词都为false,则表达式通常会返回void值。

在这里,您遇到语法错误,因为您没有正确启动子句。因此,您应该拥有(cond (= amount 0) 1)而不是(cond ((= amount 0) 1) ...)