SICP 연습문제 1.6

 제곱근을 구하는 식에서 사용한 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 했다.

사용자 삽입 이미지