プログラミング in OCaml #5

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

(* 練習問題 3.11 以下の関数を定義 *)
(* 1. ユークリッドの互除法で二整数の最大公約数を求める関数 gcd *)
let rec gcd(a, b) =
      if a mod b = 0 then b
      else gcd(b, a mod b);;

(* 2. 本文中で与えた再帰的な定義で nCm を求める関数 comb *)
let rec comb(n, m) =
    if m = 0 || n = m then 1
    else comb(n - 1, m) + comb(n - 1, m - 1);;

(* 3. 末尾再帰的関数を使ってフィボナッチ数を計算する iterfib *)
let fib n =
      let rec iterfib(i, x, y) =
          if n = i then x
          else iterfib(i+1, x + y, x)
      in
      iterfib(1, 1, 0);;

(* 4. 与えられた文字列の中で ASCII コードが最も大きい文字を返す max_ascii *)
let max_ascii str =
      let rec _max_ascii(i, max) =
          if i = String.length str then max
          else
              let len = int_of_char str.[i] in
              _max_ascii(i+1, if len > max then len else max)
      in
      char_of_int (_max_ascii (0, 0));;

1, 2 については、本当にそのまま書いたという感じ。おもすれー。
3 はちょっと悩んだ。まだまだ関数型の考えかたに慣れ無いなー。


後回しにしていたけども、標準的なコーディング規約ぐらいは知っておこうか。
インデントの数とか位置とか、カッコの前後のスペースとか、若干悩んでしまう。
あとは名前の付け方とかも慣例を知りたいなー。 _max_ascii みたいな名前ってどうよみたいな。