トップ «前の日記(2007-05-17) 最新 次の日記(2007-05-21)» 編集

U-memo

2006|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|
2009|08|10|
2010|02|03|
2011|11|12|
2012|04|
2016|02|
All= / Today= / Yesterday=

2007-05-18 [長年日記]

_ [OCaml] 手続き脳

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 と言われるとなぁ。

# 実地では例外を絡めたときにはまった