# weima learns to program

my attempt to do the exercises in sicp.

## Tuesday, December 21, 2010

### sicp exercise 3.65

;; Exercise 3.65.  Use the series

;; to compute three sequences of approximations to the natural logarithm of 2, in the same way we did above for . How rapidly do these sequences converge?

(define count 0)

(define (euler-transform s)
(let ((s0 (stream-ref s 0))           ; Sn-1
(s1 (stream-ref s 1))           ; Sn
(s2 (stream-ref s 2)))          ; Sn+1
(cons-stream (- s2 (/ (square (- s2 s1))
(+ s0 (* -2 s1) s2)))
(euler-transform (stream-cdr s)))))

(define (make-tableau transform s)
(cons-stream s
(make-tableau transform
(transform s))))

(define (accelerated-sequence transform s)
(stream-map stream-car
(make-tableau transform s)))

(define (partial-sums s)
(define result (cons-stream (stream-ref s 0)
result)

(stream-map + s1 s2))

(define (stream-limit stream tolerance)
(define (iter initial-value str)
(let ((s (stream-car str)))
(if (> tolerance (abs (- s initial-value))) s
(iter s (stream-cdr str)))))
(iter (stream-car stream) (stream-cdr stream)))
(define (incr n)
(set! count (+ count 1))
(+ 1 n))
(define (ln-2-summands n)
(cons-stream (/ 1.0 n)
(stream-map - (ln-2-summands (incr n)))))
(define ln-2-stream
(partial-sums (ln-2-summands 1)))

(define acc-ln-2-stream (accelerated-sequence euler-transform (partial-sums (ln-2-summands 1))))
(newline)

;; Value of ln 2 from wolfram alpha:
;;0.6931471805599453094172321214581765680755001343602552541206...

(display (stream-limit ln-2-stream 0.0001))(newline)
(display count)(newline)
(set! count 0)
(display (stream-limit acc-ln-2-stream 0.00001))(newline)
(display count)(newline)

;; Output: