暇シリーズ ~連分数展開(2)~

問題 1.38
1737年、スイスの数学者 Leonhard Eulerは De Fractionibus Continuis というメモを発表した。その中に e を自然対数の底として e - 2 の連分数展開がある. この分数ではNi はすべて1、Di は順に 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, ...。問題1.37 の cont-frac を使い、Euler の展開により e を近似するプログラムを書け。

Ni はすべて 1 なので、

(define (n i)
  1.0)

このように書けます。

Di のほうは

(define (d i)
  (if (= (remainder (+ i 1) 3) 0)
      (* (quotient (+ i 1) 3) 2.0)
      1.0))

と書けます。簡単にテストしてみる。

gosh> (map d '(1 2 3 4 5 6 7 8 9 10 11))
(1.0 2.0 1.0 1.0 4.0 1.0 1.0 6.0 1.0 1.0 8.0)

cont-frac の反復プロセス版手続き。

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

n と d を cont-frac-iter 手続きに渡せば e - 2 の近似値が求まります。

gosh> (cont-frac-iter n d 1000)
0.7182818284590453