計算機プログラムの構造と解釈 第二版 P40 問題1.37

まずは問題を読む。ふむふむ。
解答が必要なのは、以下

aとかbで手順があったけど、順序はばらばらにした、

0. cont-fracの回帰的プロセスバージョンを定義
1. cont-fracの反復的プロセスバージョンを定義
2. k項有限分数のkをいくつぐらいにすると、黄金比の近似値に対して4桁の精度がとれるか。


0.
回帰的バージョンは比較的楽ちんで、
終了条件で返す値を、
(/ (n k) (d k))
とすればいいと思う。


1.
反復的バージョンはかなり考えた。
分数のもっとも分母の所からはいっていって、
結果(状態)をパラメータとして次の計算に持ち込む感じ。
分母のどこまでを、一回のプロセスで計算するのかがちょっとぐぬぬ。という感じ



2.
まず、黄金比の4桁までの値は

黄金比(Wikipedia)
http://ja.wikipedia.org/wiki/%E9%BB%84%E9%87%91%E6%AF%94

黄金比の近似値
1:
1.
6180339887 ...

ということで、φ=1.618か。
あとは、力業で、kを2ぐらいから、あげていってみる



以上のような方針で以下ソース

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

;;回帰的(リカーシブ)プロセスヴァージョン
(define (cont-frac-r n d k)
  (define (cont-frac i)
    (if (< i k)
      (/ (n i) (+ (d i) (cont-frac (+ i 1) )))
      (/ (n i) (d i))))
  (cont-frac 1)) 


;;反復的(イテレーシブ)プロセスヴァージョン
(define (cont-frac-i n d k)
  (define (cont-frac i result)
    (if (= i 0)
      result
      (cont-frac (- i 1) (/ (n i) (+ (d i) result)))))
  (cont-frac (- k 1) (/ (n k) (d k))))
  
  
;; main
(define (main args)

  (display "回帰的(リカーシブ)プロセスヴァージョン k=6 の時 : ")
  (display (+ 1 (cont-frac-r (lambda (i) 1.0) (lambda (i) 1.0) 6) ))
  (newline)(newline)
  
  (display "反復的(イテレーシブ)プロセスヴァージョン k=6 の時 : ")
  (display (+ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 6) ))
  (newline)(newline)

  (display "黄金比の四桁までの近似値は1.618")(newline)
  (display "k:2の時-> ")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 2) ))(newline)
  (display "k:3の時-> ")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 3) ))(newline)
  (display "k:4の時-> ")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 4) ))(newline)
  (display "k:5の時-> ")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 5) ))(newline)
  (display "k:6の時-> ")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 6) ))(newline)
  (display "k:7の時-> ")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 7) ))(newline)
  (display "k:8の時-> ")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 8) ))(newline)
  (display "k:9の時-> ")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 9) ))(newline)
  (display "k:10の時->")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 10) ))(newline)
  (display "k:11の時->")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 11) ))(newline)
  (display "k:12の時->")(display (/ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 12) ))(newline)
  (display "k:13の時->")(display (+ 1 (cont-frac-i (lambda (i) 1.0) (lambda (i) 1.0) 13) ))(newline)

0)


実行

回帰的(リカーシブ)プロセスヴァージョン k=6 の時 : 1.6153846153846154

反復的(イテレーシブ)プロセスヴァージョン k=6 の時 : 1.6153846153846154

黄金比の四桁までの近似値は1.618
k:2の時-> 2.0
k:3の時-> 1.5
k:4の時-> 1.6666666666666665
k:5の時-> 1.6
k:6の時-> 1.625
k:7の時-> 1.6153846153846154
k:8の時-> 1.619047619047619
k:9の時-> 1.6176470588235294
k:10の時->1.6181818181818184
k:11の時->1.6179775280898876
k:12の時->1.6180555555555558
k:13の時->1.6180371352785146

k:10の時いったん、4桁あってるけど、k:11の時をみると、まだ4桁目は安定してないみたい。
そうすると、k:12位にすると、4桁の精度の近似を得れるといえそう。