Da implementação simples à versão profissional
Esta é a forma mais básica:
Melhorias adicionadas:
Características avançadas:
/**
* 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;
}