2014年12月2日火曜日

[SICP] 問題 1.38 : 連分数による自然対数の底eの近似

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を近似するプログラムを書け.
Diの値は, iを3で割った余りが2のときに2, 4, 6, 8と増えています. 手続きを定義すると次のようになります.
;; 反復的プロセスを生成
(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))

(define (euler k)
  (+ 2
     (cont-frac (lambda (i) 1.0)
                (lambda (i) 
                  (if (= (remainder i 3) 2)
                      (* 2.0 (/ (+ i 1) 3))
                      1.0))
                k)))
実行してみます.自然対数の底は定義済みでしたので,その結果と比較します.
ようこそ DrRacket, バージョン 6.1 [3m].
言語: Pretty Big; memory limit: 2048 MB.
> e
2.718281828459045
> (euler 10)
2.7182817182817183
> (euler 100)
2.7182818284590455
> 
それらしい値が得られています.

0 件のコメント:

コメントを投稿