SICP Exercise : 연습문제 1.8 :: 2007/11/09 00:13
|
|
세제곱근 cube root를 구하는 뉴튼 법은, x의 세제곱근에 가까운 값을 y라고 할 때 다음 식에 따라 y보다 더 가까운 값을 계산하는 것이다.
(x + y^2 + 2y) / 3
제곱근 프로시저처럼, 이 식을 써서 세 제곱근 프로시저를 짜보자.
글쎄 뭐 짜는 것 까지는 좋습니다. 다음과 같은 코드를 작성했습니다.
(define (cube_root x)
(if (or (= x 0) (< x 0)) 0 (cube_root_iter 1.0 x)))(define (cube_root_iter guess x)
(if (good_enough? guess x) guess (cube_root_iter (improve guess x) x)))(define (good_enough? guess x) (< (/ (abs (- (cube guess) x)) x) 0.01))
(define (cube x) (* x x x))
(define (improve y x) (+ (/ x (* 3 (* y y))) (/ (* 2 y) 3)))
(cube_root 5)
이 간단한 코드를 짜는 데만도 한시간이 걸렸습니다. 그런데 처음에는 이상하게 값이 잘 안나오고 무한루프에 빠지더군요. 의심가는 데가 있어서 google에게 물어봤는데, 아무래도 책(번역판)에 나온 뉴튼법 공식이 좀 잘못된 것 같습니다. 다음과 같이 되어야 할 것 같습니다. (책에 나온 수식의 첫 번째 +가 /로 바뀌면 됩니다.)
위의 코드에서 빨간색으로 표시된 부분이, google이 알려준 뉴튼법 공식에 따라 수정된 부분입니다. 이렇게 고치고 나니, 프로그램이 정상적인 결과를 내 놓았습니다.
이 오류가 한글판의 오류인지 아니면 원서의 오류인지 잘 모르겠어서 구글신에게 다시 물어봤습니다. 한글판의 오류입니다. -_-; 좋은 책입니다만, 40페이지를 넘어가기도 전에 오류를 하나 발견하고 나니 어쩐지 맥이 빠지는 기분입니다1.

이런 기분인거냐?
아무튼, 매일 잠들기 전에 하나씩 풀어볼 문제가 생겼다는건 기분 좋은 일이로군요. 아 이제 선형 대수학 책도 봐야하는데... -_-
- 역자분들의 노고를 폄하하거나 할 의도가 없음을 밝혀둡니다. 어쨌든 좋은 책이고, 사람이란 실수를 하게 마련이니까요. [Back]
-
SCIP Exercise 연습문제 1.8
Tracked from NoSyu의 주저리 주저리 | 2007/12/18 12:46 | DEL이 문제는 세제곱근을 구하는 프로시저 제작입니다. 해당 문제에 나오는 식을 보기 전에 Newton's method로 구해보았습니다. (관련글 : 'Newton의 방법(Newton's method)') 그런 후 책을 살펴보니 식이 전혀 다릅니다. 그래서 제가 틀렸다고 생각해 좌절하고 프로시저를 제작하였습니다. 하지만 무한루프를 계속 돌더군요. 그 이유가 무엇일까 코드를 아무리 살펴봤지만 알 수 없었습니다. ...
-
SCIP 연습문제 1.8
참으로 허무한 문제다. 분명 나의 계산에는 이상이 없었다. 보고 또 보고, 계속 봐도 나는 틀린게 없었다. 뭐가 문제지? 답은 책이 잘못된 것이었다..... 관련 링크 : http://www.buggymind.com/72 한참을 끙끙대다가 인터넷의 도움을 받기로 하고 검색한 결과 어이없는 내용없다...(하하...) 문제인즉, 세제곱을 구하는 공식이 틀렸던 것이다. 아래의 공식이 정확한 공식이다. 아래는 바뀐 코드 내용이다.
-
Kr015se의 생각
Tracked from kroisse's me2DAY | 2008/07/11 12:02 | DELSICP 초반부터 고작 연습문제에 난 오자 하나 때문에 무쟈게 고생 ㄱ-;; 찾아보니 같은 데서 낚인 사람들이 꽤 되는 듯

