Added my solutions so far
This commit is contained in:
		
							
								
								
									
										36
									
								
								ex-1-19.rkt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								ex-1-19.rkt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
#lang sicp
 | 
			
		||||
 | 
			
		||||
;; Yeah okay, this one was extremely satisfying.
 | 
			
		||||
;; I just did the calculations on-paper.
 | 
			
		||||
;; it's some simple algebra anyway, but I'll type it here:
 | 
			
		||||
;; assuming Tpq on (a0, b0):
 | 
			
		||||
;; a1 = b0q + a0 * ( p + q)
 | 
			
		||||
;; b1 = b0p + a0q
 | 
			
		||||
;; a2 = (b0p + a0q) * p + (b0q + a0 * ( p + q)) * (p + q)
 | 
			
		||||
;; b2 = (b0p + a0q) * p + (b0q + a0 * ( p + q)) * q
 | 
			
		||||
;;
 | 
			
		||||
;; rearrange a2 and b2 into a similar form to the definition of a1 and b1:
 | 
			
		||||
;; (i.e. define a2 and b2 in terms of a0 and b0 and p and q)
 | 
			
		||||
;; a2 = b0 * (q^2 + 2*p*q) + a0 * (2*q^2 + 2*p*q + p^2)
 | 
			
		||||
;; b2 = b0 * (p^2 + q^2) + a0 * (q^2 + 2*p*q)
 | 
			
		||||
;;
 | 
			
		||||
;; from here we can see that p'= p^2 + q^2, and q'= q^2 + 2 * p * q
 | 
			
		||||
;; and as a result, we have logarithmic fibonacci!
 | 
			
		||||
 | 
			
		||||
;; printing the resulting number takes longer than calculating it lmao.
 | 
			
		||||
 | 
			
		||||
(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)) ; compute p′
 | 
			
		||||
                   (+ (* q q) (* 2 (* p q))) ; compute q′
 | 
			
		||||
                   (/ count 2)))
 | 
			
		||||
        (else (fib-iter (+ (* b q) (* a q) (* a p))
 | 
			
		||||
                        (+ (* b p) (* a q))
 | 
			
		||||
                        p
 | 
			
		||||
                        q
 | 
			
		||||
                        (- count 1)))))
 | 
			
		||||
		Reference in New Issue
	
	Block a user