xancorreu:

> I get "segment violation" error with  ./factorial 400000
> How can I resolve it?

You are having a stack overflow. DMD currently doesn't print a good message 
because of this regression that is being worked on:
http://d.puremagic.com/issues/show_bug.cgi?id=6088

On Windows with DMD you increase the stack like this:
dmd -L/STACK:100000000 -run test2.d 400000 > result.txt

If it goes in overflow still, increase the stack some more. But it will take a 
long time to compute the result even with the latest 2.058head with improved GC 
because the algorithm you have used to compute the factorial is very bad.


I have rewritten your code like this:

import std.stdio, std.bigint, std.conv, std.exception;

BigInt recFactorial(in int n) {
    if (n == 0)
        return BigInt(1);
    else
        return BigInt(n) * recFactorial(n - 1);
}

void main(string[] args) {
    if (args.length != 2) {
        writeln("Factorial requires a number.");
    } else {
        try {
           writeln(recFactorial(to!int(args[1])));
        } catch (ConvException e) {
           writeln("Error");
        }
    }
}


Note the usage of ConvException, it's a very good practice to never use a 
generic "gotta catch them all" expression, because it leads to hiding other 
bugs in your code, and this is a source for troubles.

Bye,
bearophile

Reply via email to