アフィリエイト広告を利用しています

広告

posted by fanblog

2017年04月05日

計算機プログラムの構造と解釈 問題1.7

計算機プログラムの構造と解釈(SICP)の問題1.7について。


実装は以下の通り。


;;;Newton法 p.13
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))

(define (improve guess x)
(average guess (/ x guess)))

(define (average x y)
(/ (+ x y) 2))

(define (good-enough? guess x)
(let ((tolerance 0.001))
(< (abs (- (square guess) x)) tolerance)))

(define (sqrt x)
(sqrt-iter 1.0 x))




非常に小さい数のとき


例えば、
(sqrt 0.0001)
など、許容値0.001を下回る数値の平方根を求めようとすると、guessの値の小数点以下3桁が許容値以下となると再帰呼び出しが停止する。

sicp1.7.png


非常に大きい数のとき


例えば、10兆の平方根を求めようとすると途中からguessの値が変化しなくなり無限ループに陥る。

sicp1.7_2.png


guessの変化の値に注目したgood-enough?


SICPの問題1.7を素直に実装してみました。ある繰り返しから次の繰り返しのguessが許容値未満しか変化しなかったときに停止します。許容値を小さくすれば正確さが高くなります。


(define (good-enough? guess next-guess)
(let ((tolerance 0.0001))
(< (abs (- next-guess guess)) tolerance)))

(define (sqrt-iter guess x)
(let ((next-guess (improve guess x)))
(if (good-enough? guess next-guess)
next-guess
(sqrt-iter next-guess x))))



sicp1.7_3.png

小さい値や大きい値にもある程度正確な結果を返しています。

計算機プログラムの構造と解釈 第2版

新品価格
¥4,968から
(2017/4/4 18:13時点)



この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6131962
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
検索
最新記事
最新コメント
カテゴリーアーカイブ
タグクラウド
<< 2018年05月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
プロフィール
さんの画像

情報系を専攻する学生。 しばらく使わなかったりした知識は忘れていくのでこのブログにまとめてみたり。
プロフィール
×

この広告は30日以上新しい記事の更新がないブログに表示されております。