理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

問題2-5

データ抽象化するけど、pairを構成する方法として2^a3^bで記憶する方法とかあるからやってみな、この低脳!みたいなことがかかれてたのでがんばってみます。

(define (cons x y)
  (* (expt 2 x) (expt 3 y)))

構成子は問題のままです。(expt x y)はx^yを返してくれるイカしたやつです。


あとはaとbを取り出してくれるヤツ書けばいいんだけど、a取り出すには2で余りがでるまで割りまくったらいいんですよね!

(define (car z)
  (define (car-sub x cnt)
    (if (= (remainder x 2) 0)
	(car-sub (/ x 2) (+ cnt 1))
	cnt))
  (car-sub z 0))

b取り出すのもほとんどおなじ。

(define (cdr z)
  (define (cdr-sub x cnt)
    (if (= (remainder x 3) 0)
	(cdr-sub (/ x 3) (+ cnt 1))
	cnt))
  (cdr-sub z 0))

こんな感じです!

gosh> (define z (cons 10 9))
z
gosh> (car z)
10
gosh> (cdr z)
9