# FizzBuzz (Erlang)

FizzBuzz is a common exercise program, such as Hello, world! or 99 Bottles of Beer. It is based on a common game of the same name. The program prints a series of natural numbers, substituting those divisible by 3 with "Fizz", those divisible by 5 with "Buzz" and those divisible by both 3 and 5 with "FizzBuzz".

The interface to our Erlang implementation of FizzBuzz is a a single argument function called `fizzbuzz`. The `fizzbuzz` function will print FizzBuzz values for the first `N` natural numbers. The argument to the function specifies the value of `N`.

```<<fizzbuzz.erl>>=
-module(fizzbuzz).
-export([fizzbuzz/1]).
initialization
rules
termination
```

To implement FizzBuzz in Erlang, we use a tail-recursive loop. We'll need two variables: a loop counter and the maximum number of iterations. We initialize the loop counter to 1 (the first natural number), and set the maximum number of iterations to the value of `N` passed by the caller.

```<<initialization>>=
fizzbuzz(N) -> fizzbuzz(1, N).
```

The heart of our implementation is the `fizzbuzz/2` function, which implements the tail-recursive loop. At each iteration, `fizzbuzz/2` checks the current value of the loop counter `I` against the FizzBuzz rules, and prints a corresponding message.

```<<rules>>=
fizzbuzz(I, N) when I =< N ->
if
I rem 15 =:= 0 -> io:format("FizzBuzz~n");
I rem 3  =:= 0 -> io:format("Fizz~n");
I rem 5  =:= 0 -> io:format("Buzz~n");
true           -> io:format("~p~n", [ I ])
end,
fizzbuzz(I+1, N);
```

The tail-recursive loop halts when the loop counter is greater than the maximum number of iterations.

```<<termination>>=
fizzbuzz(_, _) -> ok.
```