Тип данных long
просто не достаточно «большой» для высоких факториалов, а с высоким я имею в виду больше 20, потому что:
Console.WriteLine(Factorial(20));
Console.WriteLine(long.MaxValue);
возвращает
2432902008176640000
9223372036854775807
Как вы можете видеть, они имеют тот же порядок величины, что означает, что long
не подходит даже для Factorial(21)
и действительно возвращает -4249290049419214848
.
Вы должны использовать System.Numerics.BigInteger
, который может хранить произвольно большие целые числа.