プログラミング 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 はすごく不安。こういう事で良いのか?