일단 2^a * 3^b을 표현하기위해 cons를 만듬
car는 2^a를 cdr은 3^b를 내놓도록 car과 cdr을 만듬
중복되는 내용을 밖으로 빼서 최종 버전완성
최종버전은 아래와 같다..
(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)))

;; 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)))

댓글 없음:
댓글 쓰기