제곱근을 구하는 식에서 사용한 if 라는 특별문을 임의의 프로시져로 바꾸어서 사용하는 문제이다.

 즉,

(Language : text)
  1. (define (sqrt-iter guess x)
  2.     (if (good-enough? guess x)
  3.         guess
  4.         (sqrt-iter (improve guess x)
  5.                 x)))

를 다음과 같이 바꾸어서 실행했을 때 어떤 결과 값이 나오겠느냐….이다.

(Language : text)
  1. (define (new-if predicate then-clause else-clause)
  2.     (cond (predicate then-clause)
  3.         (else else-clause)))

 처음에 혼자서 문제를 풀어 보았다. 잘 되지 않아서 정답을 찾아 보았다…

 관련 링크 : http://nosyu.egloos.com/4016689

 아하! 안되는 것이 맞구나…근데 내꺼는 코드가 약간 이상한데…다시 수정을 한 후, 실행을 해 보았다.

 그런데 결코 실행되어서는 안되는 코드가 척척 실행되는 것이다.

 왜 이럴까…한참을 고민하고 또 고민했다…

 나중에서야 어이없이 답을 알게 되었다.

 깜박하고 제일 마지막….

(Language : text)
  1. (define (sqrt x)
  2.     (sqrt-iter 1.0 x))

 부분을 입력을 안했던 것이다…..그런데 이상하게 실행을 척척 잘 되더라.

 원래는 되지 않아야 하는것이 정상일텐데…아마도 아직 내가 모르는 무언가가 있는 듯 하다.

 아무튼 문제를 해결하니 예상값이 정확하게 나왔다.

 참, 답은 무한 루프이다.

 변경된 new-if 에서 인자를 먼저 계산하니, (sqrt-iter (improve guess x) x) 부분에서 자꾸만 루프가 발생하는 것이다.

사용자 삽입 이미지
 오른쪽 하단에 러닝이 계속 돌아가는 것이 보인다.

 Stop을 누르니 kill 하겠냐는 메시지가 나온다. 당연히(?) Kill 했다.

사용자 삽입 이미지

Tags: , , ,

3 Comments on SICP 연습문제 1.6

  1. NoSyu says:

    반갑습니다. 제 블로그에 남겨주신 트랙백을 타고 왔습니다.
    저도 코딩하면서 잘못하여 답이 이상하게 나온 경우가 있어…OTL…..

  2. NoSyu says:

    저와 같은 실수를 하셨네요.
    SCIP가 아니라 SICP더라구요.
    저도 처음에 SCJP를 생각하면서 SCIP라 했었는데,
    알고보니 SICP라 황급히 고쳤습니다.OTL….

  3. 탱이 says:

    방금 죄다 고쳤습니다.

    지적안해주셨더라면..계속 모를뻔 했네요.

    저는 어딘가에서 SCIP(스식 이라고 읽는다..)라는 구절을 본것 같았습니다.

    어느순간 입에 익어서 계속 사용한 것 같네요…지금도 스식…궁시렁..

    감사합니다 : )

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.