2017-10-01 4 views
1

sicp를 읽는 중 문제가 발생했습니다 (연습 1.29). 문제를 해결하기 위해 구성표 함수를 작성했지만 함수의 재귀 호출이 잘못된 답을 얻는 것 같습니다. 정말 이상 하네. 코드는 다음과 같습니다.Scheme 언어의 재귀 호출

(define simpson 
    (lambda (f a b n) 
    (let ((h (/ (- b a) n)) 
      (k 0)) 
     (letrec 
      ((sum (lambda (term start next end) 
        (if (> start end) 
         0 
         (+ (term start) 
         (sum term (next start) next end))))) 
      (next (lambda (x) 
        (let() 
        (set! k (+ k 1)) 
        (+ x h)))) 
      (term (lambda (x) 
        (cond 
        ((= k 0) (f a)) 
        ((= k n) (f b)) 
        ((even? k) (* 2 
            (f x))) 
        (else (* 4 
           (f x))))))) 
     (sum term a next b))))) 

나는 올바른 대답을 얻지 못했습니다. 예를 들어

, 나는이 같은 심슨 함수를 호출하려고하면 :

(simpson (lambda (x) x) 0 1 4)

내가 6을 얻을 것으로 예상하지만, 나에게 10을 반환, 나는 오류가 어디 있는지 모르겠습니다. Simpson 함수 내부에서 정의 된 "sum"함수가 옳지 않은 것 같습니다.

재귀 대신 반복을 사용하여 simpson 내부의 합계 함수를 다시 작성하면 올바른 대답을 얻을 수 있습니다.

+0

돌연변이와 재귀는 위험한 조합입니다. SICP를 공부하고 있다면, 3 장에서 소개하기 전까지는'let! '을 사용하지 말아야합니다. 앞을 건너 뛰는 것은 거의 배우지 않을 때 좋은 생각입니다. – molbdnilo

+0

대단히 감사합니다. 하지만 위의 내 기능에 어떤 변화가 있었는지 알고 싶습니다. 왜 내 기능이 작동하지 않습니다. 나는 합계 함수의 동작을 단계별로 분석한다. 문제는 없지만 올바른 답을 얻을 수는 없다. 이상하게도 충분하다. ( – John

답변

0

당신은 h/3와 합을 곱해야합니다

(* 1/3 h (sum term a next b)) 
+0

예, 알고 있습니다.하지만 합계는 나에게 10이 아니라 6을 반환해야합니다. 올바른 답을 얻을 수 있습니다. 합계가 잘못되었습니다. 정말 이상합니다. 나는 그 용어가 호출되었다고 확신합니다. 4 번, 그리고 6 번을 돌려 주어야하지만 어쨌든, 도와 줘서 고마워요 – John

+0

누군가가 그 이유를 알고 있습니까? 뭔가 잘못되었거나 찾을 수 없습니다. 누군가 도와주세요 ... – John

+0

Can 예상 결과의 계산을 보여 줍니까? – soegaard