Books by Example/SICP2007.11.09 00:13
밤마다 한시간씩 SICP 문제를 풀어보고 있습니다. 오늘은 1.8을 풀어봤습니다. Scheme 언어에 익숙해지려면 아무래도 시간이 좀 많이 걸리겠군요. 문제 1.8은 이렇습니다.

세제곱근 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].

이런 기분인거냐?

이런 기분인거냐?



아무튼, 매일 잠들기 전에 하나씩 풀어볼 문제가 생겼다는건 기분 좋은 일이로군요. 아 이제 선형 대수학 책도 봐야하는데... -_-
 

  1. 역자분들의 노고를 폄하하거나 할 의도가 없음을 밝혀둡니다. 어쨌든 좋은 책이고, 사람이란 실수를 하게 마련이니까요. [본문으로]
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. Programming Pearls 를 다 보고 이 책을 보려고 작정하고 있습니다. 나중에 연습 문제 풀 때 여기 자주 와야 되겠네요. 전 이거 두권이면 올 겨울은 그냥 지나갈 듯 합니다. ㅎㅎ

    2007.11.09 10:29 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. 명백한 오타네요. ㅡㅡ;;
    사람의 일이라 피하기 힘들다지만... 이런 사항이 보고될 때마다 가슴이 두근두근 댑니다.
    또 다른 대형 사고는 없는지.... 얼마나 더 지나야 안심할 수 있을런지.... 휴~

    지적하신 사항은 오탈자 사이트에 반영해 놓겠습니다.

    2007.11.09 15:48 신고 [ ADDR : EDIT/ DEL : REPLY ]
  3. 어쩐지 제가 뉴튼법으로 구한 식과 책에 적혀있는 것이 다르다고 했습니다.OTL....

    2007.12.18 12:35 신고 [ ADDR : EDIT/ DEL : REPLY ]
  4. 저도 같은 일을 겪었어요. 어쩐지 값이 안 나와서 뒷장의 뉴튼 부분을 참고하니 풀리더라고요. :)

    2008.08.31 15:44 신고 [ ADDR : EDIT/ DEL : REPLY ]