SICP Exercise : 연습문제 1.6 :: 2007/11/06 00:38
|
|
new-if는 코드를 보면 알 수 있듯이, if가 하는 일을 흉내내는 '함수'이고, sqrt-iter는 sqrt 함수, 즉 제곱근을 구하는 함수를 구현하기 위해 내부적으로 사용된 함수입니다.
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
(define (improve guess x)
(average guess (/ x guess)))
(define (average x y)
(/ (+ x y) 2))
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))
(define (square x)
(* x x))
(define (sqrt x)
(sqrt-iter 1.0 x))
(sqrt 2) ==> 실행 결과로 1.4 어쩌구... 의 값을 내놓습니다.
답의 힌트는 윗 단락의 밑줄 그은 부분에 있습니다. new-if로 if가 하는 일을 대체할 수 있을 것 같지만, 문제가 그리 간단치 않습니다. Scheme 함수는 함수 body를 수행하기 전에, 인자들을 전부 evaluation합니다. 그러니 new-if의 세 인자도 new-if 수행 전에 전부 evaluation되어야 합니다.
따라서, 위의 코드에서 sqrt-iter 안에서 사용된 if를 new-if로 대체하게 되면, 그 세 번째 인자로 주어진 (sqrt-iter ...) 부분을 먼저 evaluation 해야하고, 그 결과로 재귀 호출이 발생하고, new-if가 다시 호출됩니다. 그 결과로 무한루프가 발생하고, 메모리 제한 조건을 적절히 설정해 두지 않았다면 Scheme 시스템이 뻗습니다.
그런데, 이 정도의 답도 빨리 못 내어 놓는 걸 보니 제 머리가 굳긴 굳은것 같군요. -_-; 앞으로 연습문제를 좀 충실히 풀어봐야겠습니다. 굳은 머리를 풀려면...
-
SCIP Exercise 연습문제 1.6
Tracked from NoSyu의 주저리 주저리 | 2007/12/18 12:44 | DEL이 문제는 'if문을 cond를 써서 대체할 수 있지 않겠나' 하는 생각에서 출발합니다. 저의 예상은 무한루프를 돈다고 생각했습니다. 이유는 sqrt-iter 프로시저를 실행시 new-if안의 인자인 sqrt-iter를 다시금 실행시켜 연습문제 1.5와 같은 이유로 무한반복을 하리라는 예상을 했습니다. 확인을 위해 코드를 작성하고 실행시켰습니다. 예상대로 오른쪽 밑에 있는 졸라맨은 무한정 달리고 있었습니다.  ...