2017-01-24 11 views
0

Я читал SICP и столкнулся с проблемой, в главе 1 есть пример с именем changeing change, мне нужно написать программу в схеме, чтобы рассчитать возможное количество способов сделать изменение любого заданного число, заданное полудолларами, кварталами, копейками, никелями и пенни. В книге показана модель замещения программы, и я попытался изменить ее на гнездовую, но не смог, может ли кто-нибудь оказать мне услугу?count change SICP

(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 
+0

Вы пропустили некоторые круглые скобки - '(cond (= amount 0) 1)' не является допустимым 'cond'. (У вас есть правильный синтаксис в 'denomination'.) – molbdnilo

ответ

1

cond выражение как правило, принимает форму (cond (predicate expr) ... (else expr)) или (cond (predicate expr) ... (#t expr)). Всякий раз, когда предикат оценивает значение true, соответствующее выражение в предложении является результатом условного выражения. Если у вас нет предиката else/# t в конце, и все предикаты условного выражения ложны, обычно выражение возвращает значение void.

У вас есть синтаксическая ошибка, потому что вы не начали предложение правильно. Итак, вместо (cond (= amount 0) 1) вы должны иметь (cond ((= amount 0) 1) ...).