プログラミング 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 みたいな名前ってどうよみたいな。