SICP問題1.37

再帰的プロセスの cont-frac

(define (cont-frac fn fd k)
  (define (recursive-frac i)
    (let ((n (fn i))
	  (d (fd i)))
      (if (= i k)
	  (/ n d)
	  (/ n (+ d (recursive-frac (+ i 1)))))))
    (recursive-frac 1)
)

4桁の精度の近似を得るのにどれくらいの大きさが必要か実験

(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 2)
; 0.5
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 3)
; 0.6666666666666666
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 4)
; 0.6000000000000001
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 5)
; 0.625
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 6)
; 0.6153846153846154
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 7)
; 0.6190476190476191
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 8)
; 0.6176470588235294
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 9)
; 0.6181818181818182
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 10)
; 0.6179775280898876
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 11)
; 0.6180555555555556
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 12)
; 0.6180257510729613
(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 13)
; 0.6180371352785146

10以上は必要そう。

反復的プロセスのcont-frac

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