SICP の ex 1.29 (シンプソンの公式)、素で以下のコードを書いた。 (コードがSICP本文の流れにそぐわないのは無視して)
let simpson f a b n = let h = (b -. a)/. float n in let rec simpson_o f i = if i<n then 4. *. f(h*.float i+.a) +. (simpson_o f (i+2)) else 0. in let rec simpson_e f i = if i<n-1 then 2. *. f(h*.float i+.a) +. (simpson_e f (i+2)) else 0. in (f a +. f b +. (simpson_o f 1) +. (simpson_e f 2)) *. h /. 3.
実行すると
> print_float (simpson (fun x->x*.x*.x) 0. 1. 100000) Stack overflow during evaluation (looping recursion?).
初心者にはループ構文や副作用の無い関数型言語は難しいと思うよ(八つ当たり
この例では末尾再帰になってないのは (わかってる人には)一目だけど、 もう少し複雑になると末尾再帰(をループに最適化してくれる) かどうかわからなくなって、 あるとき stack overflow と言われるとなぁ。
# 実地では例外を絡めたときにはまった