OCaml

OCamlでFizzBuzzを書く

OCamlの勉強を始めました。
まず最初に基本のFizzBuzzを書こうと思います。

FizzBuzzとは

FizzBuzzとは、

  • 3の倍数の時は、Fizz
  • 5の倍数の時は、Buzz
  • 3の倍数かつ5の倍数の時は、Fizz Buzz
  • それ以外は数字を出力

するプログラムです。

基本的な分岐やループがわかっていることが確かめられます。

関数

関数の書き方は、

let f a b =
    a + b ;;

と書けます。

# f 1 2;;
- : int = 3

関数呼び出しは上記の様になります。引数にはかっこはつきません。

分岐

分岐はif文が使えます。

# let max a b =
    if a > b then a
    else b;;

と書けば良いです。
if (条件) then (実行する文) となります。

再帰

再帰には関数に rec とつける必要があります。
下記に階乗のプログラムを載せておきます。

# let rec fact a b =
  if b == 1 then a
  else fact (a * (b - 1)) (b - 1);;
val fact : int -> int -> int = <fun>
# let f a =
    fact a a;;
val f : int -> int = <fun>
# f 6;;
- : int = 720

関数名の前に rec をつけると再帰呼び出しが可能になります。

FizzBuzz実装

ちなみにOCamlで剰余算は mod です。

fizzbuzz.ml
let rec fizzbuzz n max =
  if n mod 15 == 0 then Printf.printf "fizz buzz\n"
  else if n mod 3 == 0 then Printf.printf "fizz\n"
  else if n mod 5 == 0 then Printf.printf "buzz\n"
  else Printf.printf "%d\n" n;
  if n < max then fizzbuzz (n + 1) max

let () =
  fizzbuzz 1 30

最大値はハードコードしてしまいました。
以下に結果を出します。

$ ocaml fizzbuzz.ml
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizz buzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizz buzz