我的SICP习题答案(1.16~1.19)

我的SICP习题答案(1.16~1.19)

1.16
(define (fast-expt x n)
  (fast-expt-iter x n 
1 ))

(define (fast-expt-iter x n a)
  (cond ((
=  n  0 ) a)
        ((even? n) (fast-expt-iter (square x) 
                                   (/ n 
2 )
                                   a))
        (else (fast-expt-iter x 
                              (- n 
1 )
                              (* a x)))))

1.17
(define (multi x y)
  (if (
=  y  0 )
      
0
      (+ x (multi x (- y 
1 )))))

(define (fast-multi x y)
  (cond ((
=  y  0 0 )
        ((even? y) (double (fast-multi x
                               (half y))))
        (else (+ x (fast-multi x (- y 
1 ))))))

(define (double x) (+ x x))
(define (half y) (/ y 
2 ))

1.18
(define (double x) (+ x x))
(define (half y) (/ y 
2 ))

(define (fast-multi x y)
  (fast-multi-iter x y 
0 ))

(define (fast-multi-iter x y p)
  (cond ((
=  y  0 ) p)
        ((even? y) (fast-multi-iter (double x)
                                    (half y)
                                    p))
        (else (fast-multi-iter x (- y 
1 ) (+ p x)))))

1.19
; T(pq):(a,b)=>(bq+aq+ap, bp+aq)
;
T(pq):(bq+aq+ap, bp+aq)=>((bp+aq)q + (bq+aq+ap)q + (bq+aq+ap)p,
;
                          (bp+aq)p + (bq+aq+ap)q)
;
      => (2bpq+2aqq+bqq+2apq+app, bpp+2apq+bqq+aqq)
;
      => (b(2pq+qq)+a(2pq+qq)+a(qq+pp), b(qq+pp)+a(2pq+qq))
;
q' = 2pq+qq
;
p' = qq+pp
;
(define (fib n)
  (fib-iter 
1   0   0   1  n))

(define (fib-iter a b p q count)
  (cond ((
=  count  0 ) b)
        ((even? count) 
         (fib-iter a
                   b
                   (+ (* p p) (* q q))
                   (+ (* 
2  p q ) (* q q))
                   (/ count 
2 )))
        (else (fib-iter (+ (* b q) (* a q) (* a p))
                        (+ (* b p) (* a q))
                        p
                        q
                        (- count 
1 )))))


你可能感兴趣的:(我的SICP习题答案(1.16~1.19))