sicp 1.19

利用Tpq变换编写对数复杂度的求Fibonnacci数列的算法。

p=0,q=1时,Tpq对(a, b)变换为( ((p+q)a, qb), qa+pb )

令p'=p^2+q^2,q'=2pq+q^2,则Tp'q'变换相当于连续两次Tpq变换,算法如下:

 

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

你可能感兴趣的:(算法)