C# - 4 formas distintas de calcular o fatorial


Hoje veremos 4 formas diferentes de calcular o fatorial de um número.

O Fatorial é um número natural inteiro positivo, o qual é representado por n!.

O fatorial de um número é calculado pela multiplicação desse número por todos os seus antecessores até chegar ao número 1.


           n!  =
 n.(n-1).(n-2)...3.2.1
 

Exemplo:    5! =  5*4*3*2*1 = 120

Para realizar o cálculo na linguagem C# você deve atentar para o tipo de dados que você pretende usar para obter o resultado.

Os tipos de dados FLOAT, DOUBLE e DECIMAL são usados para armazenar números reais até uma certa precisão.

Qual a diferença entre esses tipos então ?

A tabela abaixo compara o intervalo, precisão, maior inteiro e tamanho:

Tipo Intervalo Precisão(Dígitos) Maior Inteiro
Exato
Tamanho
float 1.5x10^-45 / 3.4x10^38 7 2^24 4 bytes
double 5.0x10^-324 / 1.7x10^308 15-16 2^53 8 bytes
decimal 1.0x10^-28 / 7.9x10^28 28-29 2^113 16 bytes
int

    -2,147,483,648 /2,147,483,647

- - 16 bytes
long -9.223.372.036.854.775.808
até 9.223.372.036.854.775.807
- - 32 bytes

Nota: Além destes tipos temos a struct BigInteger que é um tipo imutável presente no namespace System.Numerics que representa um inteiro arbitrariamente grande cujo valor, em teoria não possui limites superiores ou inferiores.

Só para você ter uma idéia abaixo temos uma tabela de fatoriais até o número 30:

n n!
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 39916800
12 479001600
13 6227020800
14 87178291200
15 1307674368000
16 20922789888000
17 355687428096000
18 6402373705728000
19 121645100408832000
20 2432902008176640000
21 51090942171709440000
22 1124000727777607680000
23 25852016738884976640000
24 620448401733239439360000
25 15511210043330985984000000
26 403291461126605635584000000
27 10888869450418352160768000000
28 304888344611713860501504000000
29 8841761993739701954543616000000
30 265252859812191058636308480000000

A seguir vejamos 4 formas diferentes e calcular o fatorial de um número real.

1-  Usando o laço for

 private static void Fatorial_LoopFor()
  {
            double i, numero, fatorial;
            Console.WriteLine("Informe o número");
            numero = double.Parse(Console.ReadLine());

            fatorial = numero;
            for (i = numero - 1; i >= 1; i--)
            {
                Console.WriteLine($"{fatorial} * {i}");

                fatorial = fatorial * i;

                Console.WriteLine($"i={i}");
                Console.WriteLine($"fatorial={fatorial}");
                Console.WriteLine("  ");
            }
            Console.WriteLine($"\nFatorial de {numero} é {fatorial} ");
            Console.ReadLine();
 }

Este é o meio mais simples, e aqui, estou exibindo os cálculos no console.

2-  Usando o laço While

     public static  double Fatorial_WhileLoop(int numero)
     {
            double resultado = 1;
            while (numero != 1)
            {
                resultado = resultado * numero;
                numero = numero - 1;
            }
            return resultado;
      }
 

Possui menos código que o anterior.

3-  Usando recursão

        public static double Fatorial_Recursao(int numero)
        {
            if (numero == 1)
                return 1;
            else
                return numero * Fatorial_Recursao(numero - 1);
        }

 

Aqui usamos recursão para simplificar o cálculo.

4 - Usando Delegate Func()

      private static void Fatorial_DelegateFunc()   
       {
            Console.WriteLine("Informe o numero");

            Func<double, double> fatorial = null;

            fatorial = x => x <= 1 ? 1 : x * fatorial(x - 1);

            double numero = double.Parse(Console.ReadLine());

            var resultado = fatorial(numero);

            Console.WriteLine(resultado);
      }

Para chamar estes cálculos a partir do método Main podemos fazer assim:

        static void Main(string[] args)
        {
            Console.WriteLine("Recursão " + Fatorial_Recursao(15));
            Console.WriteLine("While/loop " + Fatorial_WhileLoop(15));
            Fatorial_LoopFor();
            Fatorial_DelegateFunc();
            Console.ReadLine();
        }

Executando o projeto e fazendo o teste com o fatorial do número 15 iremos obter o resultado abaixo:

E estamos conversados...

"Portanto, cingindo os lombos do vosso entendimento, sede sóbrios, e esperai inteiramente na graça que se vos ofereceu na revelação de Jesus Cristo;"
1 Pedro 1:13


Referências:


José Carlos Macoratti