This small program tests the two approaches of computing the factorial - by iteration and by recursion.
Factorial.cs:
using System;
namespace Functions
{
public class Factorial
{
public static ulong CalcRecursively(int number)
{
if (number > 1)
return (ulong)number * CalcRecursively(number - 1);
if (number <= 1)
return 1;
return 0;
}
public static ulong Calc(int number)
{
ulong rValue=1;
for (int i = 0; i < number; i++)
{
rValue = rValue * (ulong)(number - i);
}
return rValue;
}
}
}
MainProgram.cs:
using System;
using Functions;
class FunctionClient
{
public static void Main()
{
Console.WriteLine("{0}\n", Functions.Factorial.CalcRecursively(TESTED_VALUE));
Console.WriteLine("{0}\n", Functions.Factorial.Calc(TESTED_VALUE));
Console.ReadKey();
}
const int TESTED_VALUE = 60;
}
Console:
9727775195120271360
9727775195120271360
It's ok with low figures, but otherwise(f.ex. with 60) it outputs the incorrect values, according to the most reliable source on the internet. Could you point out my mistake? It's unbeliveable for me that the two totally different methods works wrong in exactly the same manner.
You are running into the limits of C#'s ulong data type. It is a 64-bit data structure which limits it to a maximum value of 18,446,744,073,709,551,615 according to MSDN.
If you do want to explore larger numbers, .NET 4 introduced the BigInteger structure you may be interested in.