by October 17, 2011
onEarlier last week we tried to use ejabberd at work for some testing. As part of that we had to apply a patch to the ejabberd sources in order to add some additional features we wanted to have.
Since there was no one really familiar with programming in Erlang I gave it a shot. After half an hour of reading in google on Erlang syntax we managed to patch the sources and add some additional logging information.
Later at home I tried if I could come up with some basic functionality to kind of get a feeling for the language. A common example when starting to learn a new programming language is to implement the factorial function:
n! = \left\{
\begin{array}{l l}
1 & \quad \text{if $n = 0$}\\
n((n-1)!) & \quad \text{if $n > 0$}\\
\end{array}\right.
This is the first approach I came up with that uses recursion:
The more interesting way of solving the above problem is to use tail-recursion. That way the temporary processing values are stored in an accumulator argument of the function that is being called. Using tail-recursion it is not necessary that every step of the recursive function has to be hold up in the stack.
-module(factorial).
-export([fac/1]).
% API function that is being exporting
fac(N) -> fac(N,1).
% factorial function using tail-recursion
fac(0, Acc) -> Acc;
fac(N, Acc) when N > 0 -> fac(N-1, N*Acc).