scheme - 计数变化 SICP

标签 scheme lisp sicp

我在阅读 SICP 时遇到了一个问题,在第 1 章中有一个名为 counting change 的示例,我需要在 scheme 中编写一个程序来计算给定一半的任何给定数字的可能变化方式- 美元、25 美分、10 美分、镍币和便士。 这本书显示了程序的替换模型,我试图将其更改为嵌套模型但失败了,谁能帮我一个忙?

(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

最佳答案

cond 表达式通常采用 (cond (predicate expr) ... (else expr))(cond (predicate expr) .. . (#t expr))。每当谓词的计算结果为真时,子句中对应的表达式就是条件表达式的结果。如果末尾没有 else/#t 谓词并且条件表达式上的所有谓词都是假的,通常表达式会返回一个 void 值。

在这里,你有一个语法错误,因为你没有正确地开始一个子句。因此,您应该使用 (cond ((= amount 0) 1) ...) 而不是 (cond (= amount 0) 1)

关于scheme - 计数变化 SICP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41824550/

相关文章:

scheme - 在 Racket 程序中使用 Scheme 库

functional-programming - 如何在Scheme/Lisp中添加结构体的元素

lambda - 如何将 let* 表达为 lambda 表达式(不是常规的 let)

scheme - 如何评估从 Scheme 中的函数返回的符号?

scheme - 你如何在 Scheme 中表达 bool 否定?

lisp - 在 Lisp 中,+ 函数实际上可以有多少个输入?

clojure - Lisp-1 和 Lisp-2 有什么区别?

filter - 在方案 (SCM) 中的 Define Filter 函数的结果末尾获取 #f 或 False

functional-programming - 用 Racket 构建 map

macros - 为什么这个 lisp 递归宏不起作用?