beerSong(N) ->
case N of
0 -> "Out of Beer\n";
1 -> "1 bottle of beer on the wall one bottle beer, take one down, pass it around, no beer\n";
2 -> "2 bottles of beer on the wall one bottle beer, take one down, pass it around, 1 beer on the wall\n";
N -> X=integer_to_list(N), [Z]=X, [X," bottles of beer on the wall ",X," bottles of beer, take one down pass it around ",[Z-1]," bottles of beer on the wall\n"]
end.
bs(N) -> io:format(beerSong(N)).

If they had a challenge to sing it in the round, parallelism would be useful. In the meantime, here's the simplest program I can imagine. It leverages recursive pattern matching and should be tail recursive.

-module(beer).
-export([song/0]).

song(0) ->
io:format("No more bottles of beer on the wall, no more bottles of beer.~nGo to the store and buy some more, 99 bottles of beer on the wall.~n~n&quot;
song(1) ->
io:format("1 more bottle of beer on the wall, 1 more bottle of beer.~nTake one down and pass it around, no more bottles of beer on the wall.~n~n&quot,
song(0);
song(2) ->
io:format("2 more bottles of beer on the wall, 2 more bottles of beer.~nTake one down and pass it around, 1 more bottle of beer on the wall.~n~n&quot,
song(1);
song(N) ->
io:format("~p bottles of beer on the wall, ~p bottles of beer.~nTake one down and pass it around. ~p bottles of beer on the wall.~n~n", [N,N,N-1]),
song(N-1).
song() ->
song(99).