2017-01-24 8 views
0

SICP를 읽었을 때 문제가 발생했습니다. 제 1 장에는 카운팅 변경이라는 예제가 있습니다. 주어진 프로그램을 변경하기위한 가능한 방법 수를 계산하기 위해 프로그램에 프로그램을 작성해야합니다. 번호 반 달러, 분기, 십센트, nickles 및 동전을 주어진. 책은 프로그램의 대체 모델을 보여 주며 중첩 된 것으로 변경하려고 시도했지만 실패했습니다. 누구든지 저에게 호의를 줄 수 있습니까? 다음카운트 변경 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)) 걸린다. 술어가 참으로 평가 될 때마다 절의 해당 표현식은 조건부 표현식의 결과입니다. 끝에 else/# t 술어가 없으며 조건식의 모든 술어가 거 ~ 인 경우, 일반적으로 표현식은 공백 값을 리턴합니다.

여기서 절을 올바르게 시작하지 않았기 때문에 구문 오류가 발생합니다. 따라서 (cond (= amount 0) 1) 대신에 (cond ((= amount 0) 1) ...)이 있어야합니다.