연습문제 1.28의 경우 '1 modulo n의 뻔하지 않은 제곱근'의 뜻을 이해하지 못했습니다.
원서에는 'nontrivial square root of 1 modulo n'이라고 적혀있더군요.
따라서 후에 풀어보기로 하였습니다.
연습문제 1.29는 심프슨의 규칙(Simpson's Rule)이라는 규칙으로
적분값을 구하는 문제입니다.
(위키를 살펴보니 책에 있는 것보다 훨씬 간단한 식이 있네요.;;)
책에 적혀진 수식을 바탕으로 프로시저를 만들었습니다.
그리고 0 부터 1 사이의 cube를 구하였습니다.

1/4로 정확하게 나오네요.^^
하지만 여기서 궁금한 것이 생겼습니다.
위의 코드는 처음에 이렇게 만들었습니다.

즉, 'h = (b-a)/n'이기에 (b-a)/n을 그대로 다 넣은 것입니다.
Lisp에서는 (/ (- b a) n)이죠.
이렇게 한 이유는 Lisp에서 C처럼 변수 선언 및 정의를 배우지 못했기 때문입니다.
a, b, n은 처음에 파라메터로 넘어왔기에
한 번 계산하여 메모리에 저장한 다음 그 값을 불러내기만 하면 되니까요.
그렇지만 그런 기법을 몰랐기에 무식하게 다 적은 것입니다.
하지만 결과는 이상했습니다.

n이 100일 때의 값도 이상하였고,
n이 1000일 때는 실행 후 화장실을 다녀와도 끝나지 않았더군요.
무엇이 문제인가 살펴보려고 하였지만 너무 복잡해서 정신이 없었습니다.
따라서 코드를 줄이기로 생각하였고, 그 때 이런 생각이 났습니다.
'변수가 아니라 프로시저로 하면 어떨까?'
그래서 '(define (h) (/ (- b a) n))'이라는 프로시저를 만들어
블록 구조(block structure)를 만들었습니다.
그러자 1/4라는 결과를 빠른 시간에 내놓았습니다.
여기에 대해 좀 더 자세히 알아보니
덧셈의 다음 항을 표현하는 프로시저인 '(define (add_kh a) (+ a (* 2 (h))))'에서
(h)가 아닌 (/ (- b a) n)를 쓸 경우 그런 문제가 나왔습니다.
본문 안에서는 (h)나 (/ (- b a) n)나 상관이 없었습니다.
어차피 같은 얘기를 하는 것이기에 상관이 없지 않는가 싶지만,
그 차이가 있는 듯싶습니다.
무엇이 그 차이를 부르는지 아직은 잘 모르겠습니다.
참조
Structure and Interpretation of Computer Programs 2/E - Page 77
- SICP Exercise 연습문제 1.32 (0)2008/01/21
- SICP Exercise 연습문제 1.31 (0)2008/01/21
- SICP Exercise 연습문제 1.30 (0)2008/01/21
- SICP Exercise 연습문제 1.29 (0)2008/01/21
- SICP Exercise 연습문제 1.27 (0)2008/01/19
- SICP Exercise 연습문제 1.25 (0)2008/01/17
- SICP Exercise 연습문제 1.24 (0)2008/01/17
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요