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 내부의 합계 함수를 다시 작성하면 올바른 대답을 얻을 수 있습니다.
돌연변이와 재귀는 위험한 조합입니다. SICP를 공부하고 있다면, 3 장에서 소개하기 전까지는'let! '을 사용하지 말아야합니다. 앞을 건너 뛰는 것은 거의 배우지 않을 때 좋은 생각입니다. – molbdnilo
대단히 감사합니다. 하지만 위의 내 기능에 어떤 변화가 있었는지 알고 싶습니다. 왜 내 기능이 작동하지 않습니다. 나는 합계 함수의 동작을 단계별로 분석한다. 문제는 없지만 올바른 답을 얻을 수는 없다. 이상하게도 충분하다. ( – John