第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