Cálculo Fatorial em JavaScript

Da implementação simples à versão profissional

1. Implementação Simples

Esta é a forma mais básica:

  • Não verifica se a entrada é válida
  • Só funciona para números pequenos
  • Não trata erros

2. Implementação com Validação

Melhorias adicionadas:

  • Verifica se o número é inteiro
  • Garante que o número é não negativo
  • Mostra mensagem de erro para entradas inválidas

3. Implementação Profissional

Características avançadas:

  • Usa BigInt para números grandes
  • Otimizado para diferentes tamanhos de números
  • Trata todos os casos especiais
  • Retorna resultados precisos para qualquer tamanho

Código JavaScript

/**
 * Implementação Simples do Fatorial
 * Demonstra a abordagem mais básica sem validações
 * @param {number} n - Número para calcular o fatorial
 * @returns {number} O fatorial de n
 */
function fatorialSimples(n) {
  let resultado = 1;

  // Loop que multiplica os números de 2 até n
  for (let i = 2; i <= n; i++) {
    resultado = resultado * i;
  }

  return resultado;
}
/**
 * Implementação com Validação
 * Adiciona verificações básicas de entrada
 * @param {number} n - Número para calcular o fatorial
 * @returns {number} O fatorial de n
 * @throws {Error} Se n for negativo ou não for um inteiro
 */
function fatorialValidado(n) {
  // Verifica se o número é negativo
  if (n < 0) {
    throw new Error("Número não pode ser negativo");
  }

  // Verifica se é um número inteiro
  if (!Number.isInteger(n)) {
    throw new Error("Deve ser um número inteiro");
  }

  let resultado = 1;

  // Loop de multiplicação
  for (let i = 2; i <= n; i++) {
    resultado = resultado * i;
  }

  return resultado;
}
/**
 * Implementação Profissional
 * Versão otimizada com suporte a BigInt para números grandes
 * @param {number} n - Número para calcular o fatorial
 * @returns {number|bigint} O fatorial de n
 * @throws {Error} Se n for negativo ou não for um inteiro
 */
function fatorial(n) {
  // Validação rigorosa
  if (n < 0 || !Number.isInteger(n)) {
    throw new Error("n deve ser um inteiro não negativo");
  }

  // Casos base: 0! e 1! = 1
  if (n === 0 || n === 1) return 1;

  // Para números grandes (acima de 20), usa BigInt
  if (n > 20) {
    let resultado = 1n; // O 'n' cria um BigInt

    // Loop com BigInt
    for (let i = 2n; i <= BigInt(n); i++) {
      resultado *= i;
    }
    return resultado;
  }

  // Para números pequenos (até 20), usa number normal
  let resultado = 1;
  for (let i = 2; i <= n; i++) {
    resultado *= i;
  }
  return resultado;
}