SICP 問題2.5

2017-09-12

aとbの対を積 $$ 2^a3^b $$ である整数で表現するなら, 非負の整数の対は数と算術演算だけを使って表現出来ることを示せ.
これに対応する手続き cons, carおよびcdrの定義は何か.

こういうことかな??

;; 割り切れるか判定
(define (devisible? divide target)
  (= (remainder target divide) 0))

;; 割り切れなくなるまで割る(回数を返す)
(define (fact-x-iter d n cnt)
  (if (devisible? d n)
      (fact-x-iter d (/ n d) (+ cnt 1))
      cnt))

;; 指数計算
(define (exp-iter base n cnt result)
  (if (= cnt n)
    result
    (exp-iter base n (+ cnt 1) (* base result))))

;;;;;;;;;;;;;;
;;; cons, car, cdr
;;;;;;;;;;;;;;
(define (cons a b)
  (* (exp-iter 2 a 0 1) (exp-iter 3 b 0 1)))
(define (car n)
  (fact-x-iter 2 n 0))
(define (cdr n)
  (fact-x-iter 3 n 0))

;;; test
(print (cons 3 4))
;=> 648
(print (car (cons 3 4)))
;=> 3
(print (cdr (cons 3 4)))
;=> 4