Taras Bunyk

SICP 1.3.3 Procedures as general methods

Published: 2020-06-29T21:32:06.000Z

I'll attach solution from previous section to this post as it was the only exercise there.

Exercise 1.34 Runtime error with types

(define (f g)
  (g 2))
(f f) -> (f 2) -> (2 2)

2 is obviously not a function, so scheme gives error when you try to apply it as function.

Exercise 1.35 Use fixed point procedure for finding golden ratio

So, let's divide both sides of equation Φ2 = Φ + 1. We get Φ = 1 + 1/Φ - and this is exactly the formula to find fixed point for.

(define tolerance 0.00001)
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    (let ((next (f guess)))
      (if (close-enough? guess next)
          next
          (try next))))
  (try first-guess))
(fixed-point (lambda (x) (+ 1 (/ 1 x))) 1.0)

Exercise 1.36 Printing sequence of approximations

(define tolerance 0.00001)
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    (let ((next (f guess)))
      (display "Approximation: ") (display next)(newline)
      (if (close-enough? guess next)
          next
          (try next))))
  (try first-guess))
(fixed-point (lambda (x) (/ (log 1000) (log x))) 2.0)

Exercise 1.37 Golden ratio from continued fraction

(define (cont-frac n d k)
  (define (iter i) 
    (/ (n i) (if (= i k)
       (d i)
       (+ (d i) (iter (+ i 1)))
    ))
  )
  (iter 1)
)

(define (golden k)
    (/ 1 (cont-frac (lambda (i) 1.0)
           (lambda (i) 1.0)
           k))
)

(golden 12)
;Value: 1.6180555555555558

Iterative continuous fraction:

(define (cont-frac n d k)
  (define (iter i result) 
    (if (= i 0)
      result
      (iter
        (- i 1)
        (/ (n i) (+ (d i) result))
      )
    )
  )
  (iter k 0)
)

Exercise 1.38 Euler number

(define (e k)
  (+ 2 (cont-frac
         (lambda (i) 1.0)
         (lambda (i)
           (if (= (remainder i 3) 2)
             (* (+ 1 (floor (/ i 3))) 2)
             1.0
            )
         )
         k
  ))
)

(e 15)
;Value: 2.718281828470584

Exercise 1.39 Continued fraction tangent

(define (tan x k)
  (let ((n_sqr (- 0 (* x x))))
      (/ x (+ 1 (cont-frac
        (lambda (i) n_sqr)
        (lambda (i) (+ 1 (* i 2)))
        k
      )))
  )
)

(tan (/ pi 4) 100)
;Value: .9999999732051038

(tan (/ pi 2) 1000)
;Value: 37320539.58514773

(tan 0 100)
;Value: 0

Approximately so.