プログラミング in OCaml #4

プログラミング in OCaml (目次) - kengpong

(*
 * 練習問題 3.7
 * x は実数、n は0 以上の整数として、x**n を計算する関数 pow (x, n) を
 * 以下の2通りで定義しなさい。
 *)
(* 1. 計算中に pow の再帰呼び出しをn回伴う定義 *)
let rec pow (x, n) =
    if n < 2 then x
    else pow(x, n - 1) *. x;;

(* 2. 計算中の pow の再帰呼び出しが約 log2n 回ですむ定義 *)
let rec pow(x, n) =
    if n = 0 then 1.0
    else if n mod 2 = 0 then pow(x *. x, n / 2)
    else pow(x *. x, n / 2) *. x;;

(* 練習問題 3.8 指数関数を iterpow という名前で反復的的に定義しなさい *)
let pow(x, n) =
    let rec iterpow(x, n, res) =
        if n < 1 then res
        else iterpow(x, n - 1, res *. x)
    in    iterpow(x, n, 1.0);;

3.7-2 はカンニングした。冪乗 - Wikipediaにあるバイナリ法と呼ばれる手法らしい。

3.8 はすごく不安。こういう事で良いのか?