On Thu, Jul 24, 2014 at 01:14:40PM +0000, Darren via Digitalmars-d-learn wrote:
> I have the following code in fac.d (modified from the factorial
> examples on RosettaCode):
> 
> #!/usr/bin/rdmd
> import std.bigint;
> 
> pure BigInt factorial(BigInt n) {
>     static pure BigInt inner(BigInt n, BigInt acc) {
>       return n == 0 ? acc : inner(n - 1, acc * n);
>     }
>     return inner(n, BigInt("1"));
> }
> 
> void main(string[] args) {
>       import std.stdio;
>       BigInt input = args[1];
>       writeln(factorial(input));
>       return;
> }
> 
> It (more or less consistently) on my machine will calculate 'fac
> 47610', and (more or less consistently) will core dump with a segfault
> on 'fac 47611'.
[...]

You're probably running out of stack space because of your recursive
function. Write it as a loop instead, and you should be able to go
farther:

        pure BigInt factorial(BigInt n) {
                auto result = BigInt(1);
                while (n > 1)
                        result *= n;
                return result;
        }


T

-- 
Ignorance is bliss... until you suffer the consequences!

Reply via email to