[erlang-questions] Preventing Recursion from Crashing Me...

Alpár Jüttner alpar@REDACTED
Sun Feb 24 12:01:35 CET 2008

The problem is that you use non-tail recursion in your factorial
implementation. Try this instead:


factorial(0) -> 1;
factorial(N) ->
factorial(P,1) ->
factorial(P,N) ->

This will not exhaust the system memory. Still do not expect a result
for factorial(1000000). First, it would take a very long time to compute
it (multiplication of such a big numbers are very slow). Secondly, after
a lot of computation you will get this:

% X=math1:factorial(1000000),0.
** exception error: a system limit has been reached
     in function  math1:factorial/2

My guess is that factorial(1000000) is just too big to store even as a
bignum. At least you can compute factorial(100000) using the
tail-recursive implementation.


On Sun, 2008-02-24 at 10:03 +1030, David Lloyd wrote:
> I rather quickly discovered that:
> -module(math1).
> -export([factorial/1]).
> factorial(0) -> 1;
> factorial(N) -> N * factorial(N-1).
> ...
> erl
> % c(math1).
> % math1:factorial(1000000).
> ...was able to take sufficient resources that I only just managed to 
> send a ctrl+alt+break (I'm running Gnome/JDS on Solaris SXCE b72 on a 
> Intel Quad Core E6600 with 4Gb of memory).
> Apart from not using naive fibonacci ( :P ) is there a way to prevent 
> erlang from running away with such processes?
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions

More information about the erlang-questions mailing list