計算機プログラムの構造と解釈 第二版 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桁の精度の近似を得れるといえそう。