April 2012
1 post
5 tags
SICP 연습문제 1.22
한동안 공부할 만한 멘탈 상태가 아니라서 쉬고 있었습니다. 이러면 안되겠다는 생각에 문제나 풀었습니다. 이 연습 문제에 대해서는 문제와 답을 생략하고, 필요한 프로시저만 포스팅하도록 하겠습니다. 문제가 너무 길고, 공부한 내용을 실험으로 체크해보는 형태의 문제라 포스팅하기 난감하네요. (define (search-for-primes start end)   (define (check-and-next-iter cur)     (timed-prime-test cur)     (iter (+ cur 2)))   (define (iter cur)     (if (< cur end)         (check-and-next-iter cur)         0         )     ) ...
Apr 5th
March 2012
8 posts
SICP 연습문제 1.17, 1.18
연습문제 1.17에 되도는 프로세스로 짜라는 말이 없어서 얼떨결에 반복 프로세스를 펼치는 프로시저를 짜버렸습니다. 그리고 1.18번 문제를 보니 1.17에서 짠 프로시저를 반복 프로세스로 고치라네요? 아이고, 귀찮으니 1.18번에 대한 해답만 포스팅 합니다. 연습문제 1.17  이 절에서 나오는 거듭제곱 알고리즘은 여러번 곱셈을 거듭하여 값을 구한다는 단순한 생각에 뿌리를 둔다. 이와 비슷하게 곱셈도 덧셈을 거듭하는 것으로 나타낼 수 있다. 다음은 expt 프로시저처럼 (언어에서 덧셈만 있고 곱셈은 없다 치고) 덧셈으로 곱셈 프로시저를 짜본 것이다. (define (* a b)   (if (= b 0)       0       (+ a (* a (- b 1))))) 이 알고리즘의 계산...
Mar 29th
3 tags
안드로이드 때문에 삶이 고달픕니다.
 이제까지 안드로이드용 앱 개발을 하면서 수많은 멘탈붕괴를 겪었습니다. 근본적인 해결을 하지 못한 기기별 사운드 싱크 문제라던가, WebView에서 loadURL에 get인자를 넣으면 페이지 로드에 실패하는 문제라던가, 특정 HTML 페이지에서 text form을 탭하면 렌더링이 엉망이 되었다가 refresh 하고 나면 text form을 탭해도 렌더링이 문제가 발생하지 않는다든가….   언급하자면 한도 끝도 없습니다. 파편화 때문에 OS와 SDK의 버그에 대해서 업데이트를 기대할 수 없음에도 불구하고, 안드로이드 앱을 개발해야 하는 상황이 이런 문제들을 어떻게든 땜질해야 하게 만들었죠.   오늘도 어김없이 안드로이드는 저의 멘탈을 흔들어 놓았습니다. 상황이 복잡해서 설명하긴 좀 어렵지만,...
Mar 29th
5 tags
SICP 연습문제 1.16
1.13~1.15는 단답형 문제라 포스팅하지 않겠습니다. fast-expt처럼 계산 시간이 로그 비례로 늘어나게끔 계속 제곱하는 방법을 쓰되, 반복 프로세스를 펼처내는 거듭제곱 프로시저를 짜보자. (귀띔: (b^(n/2))^2 = (b^2)^(n/2)이라는 점을 생각하여 지수 n, 밑수 b, 새  변수 a를 변수로 삼아 상태 바꾸는 귀칙을 정의하되, ab^n 값이 언제나 같도록  하라. 프로세스가 막 돌아갈 때 a는 1이고, 프로세스가 끝났을 때 a에 결과 값이 들어 있다. 대체로 상태가 바뀌어도 변하지 않는 값, 곧 변하지 않는 양을 찾아 정하는 것이, 반복 알고리즘을 설계할 때 아주 도움이 되는 방법이다.) 이 문제에 대한 저의 풀이는 다음과 같습니다. (define (even? x)  ...
Mar 29th
4 tags
SICP 연습문제 1.12
연습문제 1.12 다음 같은 꼴로 수를 모아 놓는 것을 파스칼의 세모꼴이라 한다.     1    1 1   1 2 1  1 3 3 1 1 4 6 4 1 …….. 세모에서 왼쪽과 오른쪽 끝에는 모두 1이 있고, 세모 속에 있는 수는 바로 위에 있는 두 수를 더한 값이다. 파스칼의 세모꼴 수를 만드는 프로시저를 짜되, 되도는 프로세스가 나오도록 하라. 몇 번째 줄인지를 x, 몇 번째 숫자인지를 y로 나타내면 다음과 같은 함수로 나타낼 수 있습니다. f(x,y) = f(x-1, y) + f(x-1, y-1)  그럼 프로시저를 짜는 것은 해당 함수를 그대로 코드로 옮기면 되죠. (define...
Mar 29th
4 tags
SICP 연습문제 1.11
연습문제 1.11 n<3일 때 f(n)=n 이고, n>=3일 때 f(n)=f(n-1)+2f(n-2)+3f(n-3)으로 정의한 함수 f가 있다. f의 프로시저를 되도는 프로세스가 나오도록 짜라. 아울러, 반복 프로세스를 만들어내느 프로시저도 만들어 보라. 되도는 프로세스가 나오도록 짜는건 정말 쉽습니다. 그냥 정의대로 작성하면 되니까요. (define (recursive-f n)   (if (< n 3)       n       (+ (recursive-f (- n 1))          (* 2 (recursive-f (- n 2)))          (* 3 (recursive-f (- n 3)))))) 하지만, 반복 프로세스가 나오도록 짜는건 좀 귀찮습니다....
Mar 29th
5 tags
SICP 연습문제 1.9
연습문제 1.9 다음 두 프로시저는 모두 0보다 큰 정수 두 개를 더하는 일을 하는데, 인자에 1을 더하는 inc 프로시저와 인자에서 1을 빼는 dec 프로시저를 가져다 쓴다. (define (+ a b)   (if (= a 0)       b       (inc (+ (dec a) b)))) (define (+ a b)   (if (= a 0)       b       (+ (dec a) (inc b)))) 맞바꿈 계산법에 따라 두 프로시저가 (+ 4 5)를 계산하는 프로세스를 밝혀라. 이 프로세스는 반복(iteration)하는가? 아니면 되도는(recursion)가? 좋은 문제이지만 맞바꿈 계산법을 굳이 하고 싶지는 않군요. 그건 너무 고달프고 귀찮으니까요. 하지만,...
Mar 29th
3 tags
SICP 연습문제 1.8
정주행을 다시 시작한 뒤, 이미 풀었던 문제는 난이도가 그다지 높지 않아 정리하지 않고 넘어가도록 하겠습니다. 그래서 연습문제 1.8부터 시작합니다. 연습문제 1.8  세제곱근을 구하는 뉴튼 법은, x의 세제곱근에 가까운 값을 y라고할 때 다음 식에 따라 y보다 더 가까운 값을 계산하는 것이다. ((x/y^2)+2y)/3 제곱근 프로시저처럼, 이 식을 써서 세제곱근 프로시저를 짜보자. 포스팅하지는 않았지만, SICP에서 이 문제가 나오기 직전에 뉴튼 법으로 제곱근 찾는 연습이 있었기 때문에 쉽게 풀 수 있었습니다. 일단 기본적인 반복 구조를 잡습니다. (define (cube-root-iter guess pre-guess x)   (if (good-enough? guess...
Mar 29th
5 tags
컴퓨터 프로그램의 구조와 해석(SICP)의 연습 문제를 풀어보며 포스팅을 해보려 합니다. 재작년 쯤에는 SICP를 틈틈이 공부했었지만, 어쩌다보니 흐지부지 되어 지금까지 버려놓고 있었습니다. -_- 프로그래머로서 당연히 알아야할 기초 지식을 공부하고, 함수형 프로그래밍을 연습해 볼 수 있는 좋은 책인데 제 자신의 게으름과 나태함에 때문에 여기까지 왔군요. 반성해야겠네요. 아무래도 Scheme에는 익숙하지 않다보니 뻘스러운 행위를 많이 할지도 모르겠습니다. 만약 보시는 분이 계시다면, 그럴때는 ‘에혀, 그냥 그렇게 살아라.’ 하지 마시고 가차없는 지적과 갈굼 부탁드리겠습니다. 
Mar 28th