연습문제 1.28의 경우 '1 modulo n의 뻔하지 않은 제곱근'의 뜻을 이해하지 못했습니다.

원서에는 'nontrivial square root of 1 modulo n'이라고 적혀있더군요.

따라서 후에 풀어보기로 하였습니다.

 

 

연습문제 1.29는 심프슨의 규칙(Simpson's Rule)이라는 규칙으로

적분값을 구하는 문제입니다.

(위키를 살펴보니 책에 있는 것보다 훨씬 간단한 식이 있네요.;;)

 

책에 적혀진 수식을 바탕으로 프로시저를 만들었습니다.

그리고 0 부터 1 사이의 cube를 구하였습니다.

 

c5

1/4로 정확하게 나오네요.^^

 

 

하지만 여기서 궁금한 것이 생겼습니다.

위의 코드는 처음에 이렇게 만들었습니다.

c7

즉, 'h = (b-a)/n'이기에 (b-a)/n을 그대로 다 넣은 것입니다.

Lisp에서는 (/ (- b a) n)이죠.

 

이렇게 한 이유는 Lisp에서 C처럼 변수 선언 및 정의를 배우지 못했기 때문입니다.

a, b, n은 처음에 파라메터로 넘어왔기에

한 번 계산하여 메모리에 저장한 다음 그 값을 불러내기만 하면 되니까요.

그렇지만 그런 기법을 몰랐기에 무식하게 다 적은 것입니다.

 

하지만 결과는 이상했습니다.

c6

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

크리에이티브 커먼즈 라이선스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1264

댓글을 달아 주세요

[로그인][오픈아이디란?]