2008. 4. 3.

연습문제 2.5

일단 2^a * 3^b을 표현하기위해 cons를 만듬


;; ex 2.5
(define (pd-cons x y)
  (* (expt 2 x)
     (expt 3 y)))


car는 2^a를 cdr은 3^b를 내놓도록 car과 cdr을 만듬
(define (pd-car x)
  (define (iter n)
    (cond ((= (remainder n 3) 0) (iter (/ n 3)))
          (else n)))
  (iter x))

(define (pd-cdr x)
  (define (iter n)
    (cond ((= (remainder n 2) 0) (iter (/ n 2)))
          (else n)))
  (iter x))


중복되는 내용을 밖으로 빼서 최종 버전완성

(define (pd-iter n z)
  (cond ((= (remainder n z) 0) (pd-iter (/ n z) z))
        (else n)))

(define (pd-car x)
  (pd-iter x 3))

(define (pd-cdr x)
  (pd-iter x 2))

마지막으로 최종 결과의 지수부만 빼내는 부분을 만든다.

(define (exp base n)
  (define (iter n result)
    (cond
      ((= n 1) 0)
      ((= (/ n base) 1) result)
      (else (iter (/ n base) (+ result 1)))))
  (iter n 1))



최종버전은 아래와 같다..
(define (pd-cons x y)
  (* (expt 2 x)
     (expt 3 y)))

(define (exp base n)
  (define (iter n result)
    (cond
      ((= n 1) 0)
      ((= (/ n base) 1) result)
      (else (iter (/ n base) (+ result 1)))))
  (iter n 1))

(define (pd-iter n z)
  (cond ((= (remainder n z) 0) (pd-iter (/ n z) z))
        (else n)))

(define (pd-car x)
  (exp 2 (pd-iter x 3)))

(define (pd-cdr x)
  (exp 3 (pd-iter x 2)))

댓글 없음:

댓글 쓰기