2013-06-02 4 views
2

나는 현재 SICP의 운동 1.29 일하고 있어요, 내 프로그램은 나에게 다음과 같은 오류주고 유지 : 나는 racket 사용하고 있는데 코드 여기+ : 두 번째 인수로 유형 <number>이 필요합니다. # <void>;

+: expects type <number> as 2nd argument, given: #<void>; other arguments were: 970299/500000

을 것 :

(define (cube x) 
    (* x x x)) 

    (define (integral2 f a b n) 
    (define (get-mult k) 
     (cond ((= k 0) 1) 
      ((even? k) 4) 
      (else 2))) 
    (define (h b a n) 
     (/ (- b a) n)) 
    (define (y f a b h k) 
     (f (+ a (* k (h b a n))))) 
    (define (iter f a b n k) 
     (cond ((> n k) 
      (+ (* (get-mult k) 
        (y f a b h k)) 
       (iter f a b n (+ k 1)))))) 
    (iter f a b n 0)) 

(integral2 cube 0 1 100) 

I을 "2 인자"를 추측하는 것은 현재 반복과 미래 반복을 추가하는 곳을 가리 킵니다. 그러나 왜 두 번째 인수가 숫자를 반환하지 않는지 이해할 수 없습니다. 누구든지이 오류를 해결하는 방법을 알고 있습니까?

+0

당신이 제시하는 코드가 자체 포함되어있는 것이 가장 좋기 때문에'cube'의 정의를 포함 시켜서 예제가 실행 가능해야합니다. –

+1

h는 상수이며 원하는 b와 n의 값을 포함하는 클로저에 정의됩니다. 당신의 정의는 인수를 사용하지 않기 위해 다시 쓰여질 수 있습니다. y는 k 만 필요하고 iter는 k와 n 만 필요합니다. iter에서 n = k 인 경우를 포기했고 알고리즘의 일부분 (* (/ h 3) sum-terms)을 잊어 버렸습니다 – WorBlux

답변

3

iter 절차에 else 조항이 누락되었습니다. 자신에게 물어보십시오 : (<= n k) 일 때 어떻게해야합니까? 그것은 재귀의 기본 경우이며 숫자도 반환해야합니다!

(define (iter f a b n k) 
    (cond ((> n k) 
     (+ (* (get-mult k) 
       (y f a b h k)) 
      (iter f a b n (+ k 1)))) 
     (else <???>))) ; return the appropriate value 
+2

라켓은 단발의'if'를 허용하지 않습니다. 'else' 표현식을 제공해야합니다 (또는 효과를 원하면'when'을 사용하십시오). 이것은 실수를 잡는 데 도움이되기 때문에 좋습니다. 불행하게도 Racket은'else'없이'cond'를 허용합니다. 그리고 비슷한 실수를 저지르는 것을 돕지 않습니다. –

5

"2 인수"식이다 (iter f a b n (+ k 1))+ 두 번째 인자를 의미한다. 오류 메시지에 따르면 해당 식은 의미있는 값이 아닌 void로 평가됩니다. 그게 왜 그랬을까요? 이 표현은 숫자로 평가하지 않을 어떤 상황에서

(cond ((> n k) 
     (+ (* (get-mult k) 
      (y f a b h k)) 
      (iter f a b n (+ k 1))))) 

:

음, iter의 전체 몸이 cond 식입니다? 음,이 표현은 무엇을합니까? nk보다 큰지 확인하고,이 경우 추가 결과 (숫자 여야 함)를 반환합니다. 그러나 nk 또는 k보다 작 으면 어떨까요? 그래도 숫자를 반환해야하며 지금은 그렇지 않습니다.