練習問題 3.9
if式を OCaml の関数で表現することはできません。次の関数は、それを試みたものですが、fact 4 の計算の評価ステップを考え、なぜうまく計算できないのか説明しなさい。
(* 練習問題 3.9 *)
let cond (b, e1, e2) :int = if b then e1 else e2;;
let rec fact n =
cond ((n = 1),
1,
n * fact (n-1));;
(*
cond 式のなかから、外側の fact式を呼んでいるから
うまくいかないのかな?
cond式の条件分岐がうまく働かず、n * fact(n-1)をずっとくりかえすため、
いつまでも終わらないので、Stack overflow となるのではないか。
参考:http://takatoh.hatenablog.com/entry/20071216/practice_3_9
*)
let rec fact2 n =
if n = 1
then 1
else n * fact2 (n-1);;
上記で、
# fact 4;;
とすると、
Stack overflow during evaluation (looping recursion?).
というエラーが出る。
# fact2 4;;
とすると、
– : int = 24
と、うまく表示される。