コード
prec = 0.0001mysqrt :: Double -> Double
mysqrt x = sqrt_iter 1 x x
where sqrt_iter guess last_guess x = if good_enough guess last_guess then
guess
else
sqrt_iter (improve guess x) guess x
where
good_enough guess last_guess = (abs (guess - last_guess) / guess) < prec
improve guess x = average guess (x / guess)
where average a b = (a + b) / 2
実行結果
*Main> mysqrt 21.4142135623746899
*Main> mysqrt 20000
141.42135623738412
*Main>
SICPのSchemeのコードほぼそのまま。何のひねりもない。
Schemeよりは分かりやすいような気もするけど、この程度じゃあまり変らないよね...
Schemeで hoge? 、Common Lispで hoge-p と命名するような predicateな関数は、Haskellではどのように命名するのが一般的なんだろうか?
コードよりは、
- ニュートン法とは?
- どうしてニュートン法で平方根を求めることができるの?
接線の方程式とか、微分とか、いろいろ忘れているなぁ。
たまには数学を再勉強しなきゃ。
0 件のコメント:
コメントを投稿