Как вычислить факториал на c#?

Каким самым простым способом в c# можно вычислить факториал???


Ответы (5 шт):

Автор решения: lleballex
public static long Fact(long n) {
  if(n == 0)
    return 1;
  else
    return n * Fact(n - 1);
}

long num = Fact(5);  ///120
→ Ссылка
Автор решения: Mark Shevchenko

C# мультипарадигменный язык, поэтому в нём может быть несколько простых способов вычисления факториала.

Императивный способ это классический цикл for:

// подключаем сборку System.Runtime.Numerics для типа BigInteger
using System.Numerics;

public BigInteger Factorial(int n)
{
    var factorial = new BigInteger(1);
    for (int i = 1; i <= n; i++)
        factorial *= i;

    return factorial;
}

Здесь мы использовали тип BigInteger, который позволяет вычислять факториалы произвольного размера.

Рекурсивный способ здесь в ответах уже привели.

Можно привести другой функциональный способ вычисления, основанный на возможностях LINQ:

public BigInteger Factorial(int n)
{
    return Enumerable.Range(1, n)
                     .Aggregate(new BigInteger(1), (f, i) => f * i);
}

По сути здесь делается то же самое, что и в первом примере.

→ Ссылка
Автор решения: VoidStack

Тоже один из возможных вариантов решения:

public static double Factorial(double a)
{
    if (a % 1 == 0)
    {
        if (a == 0) return 1;

        if (a > 0)
        {
            int _ = 1;

            for (int i = 1; i <= a; i++)
            {
                _ *= i;
            }
            return _;
        }
    }
    return double.NaN;
}
→ Ссылка
Автор решения: Kat Belka

А можно

long fact = 1;
int h1 = 5; // Факториал какого числа.
if (fact == 0)
{
    Console.WriteLine(1);
}
else
{
    for (int i = 1; i <= h1; i++)
    {
        fact *= i;
    }
    Console.WriteLine(fact);
}

или с функцией

void factorial(int fact)
{
    int h1 = fact;
    long h2 = 1;
    if (fact == 0)
        Console.WriteLine(1);
    else
   {
        for (int i = 1; i <= h1; i++)
        {
            h2 *= i;
        }
    }
    Console.WriteLine(h2);
}
factorial(5);
→ Ссылка
Автор решения: Dev18

предложу скомбинировать ответ 2 (рекурсию) с тернарным оператором

лаконичная запись

public static long Factorial(int n) => n == 0 ? 1 : n * Factorial(n - 1);

Тернарный оператор ? определяет, нужно ли вернуть 1 (если n равно 0) или результат умножения n на рекурсивный вызов Factorial (n - 1).

Если n равно 0, функция возвращает 1, как и положено по определению факториала

Если n больше 0, функция вызывает саму себя с уменьшенным значением n, пока не достигнет 0

по-моему самый полный/понятный/простой вариант с for

→ Ссылка