SICP - Solution: Exercise 2.5

Jan 7, 2019 07:09 · 228 words · 2 minute read

Exercise 2.5: Show that we can represent pairs of nonnegative integers using only numbers and arithmetic operations if we represent the pair $a$ and $b$ as the integer that is the product ${2^a3^b}$. Give the corresponding definitions of the procedures cons, car, and cdr.

Solution

This method can work not just with 2 and 3, but any relative prime numbers. For exemple, using $a=2$ and $b=3$, we have:

$$2^43^5=2\times2\times2\times2\times3\times3\times3\times3\times3=3888$$

By this definition, $3888$ can be divided $2^4=16$ before the result will have a remainder. Dividing by one more will give $\frac{3888}{2^5}=121.5$. We can use this to encode the number by computing cons using the formula:

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

The implementation of car and cdr looks very much alike: it just counts the number of times the number can be divided by 2 or 3 before returning a remainder:

(define (car x)
  (define (car-iter x count)
  (if (= 0 (remainder x 2))
      (car-iter (/ x 2) (+ 1 count))
      count))
  (car-iter x 0))

(define (cdr x)
  (define (cdr-iter x count)
  (if (= 0 (remainder x 3))
      (cdr-iter (/ x 3) (+ 1 count))
      count))
  (cdr-iter x 0))

(print (cons 3 18))       (newline)
(print (car (cons 3 18))) (newline)
(print (cdr (cons 3 18))) (newline)

I have not found more efficient methods than this.

The result of the evaluation:

3099363912
3
18