SICP 연습문제 2.5 친절한 풀이

문제

오로지 수와 산술 연산만으로 양의 정수 쌍도 표현해 보자. 정수 a,b 쌍을 2a3b2^a3^b로 나타낼 때, 이에 알맞은 cons, car, cdr 프로시저를 정의해 보라.

문제로 부터 얻은 것

cons를 만들 수 있는 참신한 방법을 하나 알아갑니다.
또한 이런식으로 구현해도 요약의 경계 덕분에 cons를 사용하는 데에 아무런 문제가 없을 것입니다.

문제풀이

정수 a,b 쌍을 2a3b2^a3^b로 나타낸다고 했을때
a값을 구하기 위해서는 2a3b2^a3^b에 a가 몇번 곱해져 있는지를 계산하면 됩니다.

base를 n으로 몇번 나눌 수 있지를 검사하는 프로시저 입니다.

(define (divides? base n)
(= (remainder base n) 0))

(define (divides-time base n)
(define (iter base n result)
(if (divides? base n)
(iter (/ base n) n (+ result 1))
result))
(iter base n 0))



그러면 cons, car, cdr의 구현은 다음과 같습니다.

(define (pow b n)
(if (= n 0)
1
(* b (pow b (- n 1)))))

(define (cons a b)
(* (pow 2 a) (pow 3 b)))

(define (car z)
(divides-time z 2))

(define (cdr z)
(divides-time z 3))

(car (cons 3 4))

(cdr (cons 3 4))



(cons 3 4)가 잘 동작하는 모습

읽어주셔서 감사합니다.