第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