第3章 練習問題 1-5
1 実数の絶対値
実数を浮動小数のことと解釈する。すると<は同じ型の値同士しか比較できないので、浮動小数と0を比較することはできない。
fun {Abs X}
if X < 0.0 then
~X
else
X
end
end
2 立方根
ImproveとGoodを変更した。
fun {CubicRoot X}
fun {Iter Guess X}
fun {Improve Guess X}
(X/(Guess*Guess) + 2.0*Guess)/3.0
end
fun {Good Guess X}
{Abs X-Guess*Guess*Guess}/X < 0.00001
end
in
if {Good Guess X} then Guess
else {Iter {Improve Guess X} X} end
end
Guess=1.0
in
{Iter Guess X}
end
3 二分法
Goodをどう定義したらいいか分らない。相対誤差を使うべきなのだろうけど、AもBも0になりうるじゃん。
declare
fun {Solve F A B}
fun {Iter A B}
fun {Improve A B}
X = (A+B)/2.0
in
if {F X} > 0.0 then
[A X]
else
[X B]
end
end
fun {Good A B}
{Abs A-B} < 0.0001
end
in
if {Good A B} then
A
else
local [A1 B1] = {Improve A B} in
{Iter A1 B1}
end
end
end
in
{Iter A B}
end
fun {F X}
X-2.0
end
{Show {Solve F 0.0 3.0}}
4 反復的階乗計算
fun {Fact N}
fun {IterFact I N}
if N == 0 then
I
else
{IterFact I*N N-1}
end
end
in
{IterFact 1 N}
end
5 反復的SumList
fun {SumList Xs}
fun {IterSumList I Xs}
case Xs of
nil then I
[] X|Xr then {IterSumList I+X Xr}
end
end
in
{IterSumList 0 Xs}
end