Este projeto simples, porém didático, explora diferentes maneiras de calcular o fatorial de um número utilizando JavaScript, apresentando desde a implementação mais básica até uma solução robusta que lida com desafios comuns da programação, como a precisão de números grandes.
O fatorial de um número inteiro não negativo n, denotado por n!, é o produto de todos os inteiros positivos menores ou iguais a n. Por exemplo, 5! (lê-se "cinco fatorial") é calculado como 5 × 4 × 3 × 2 × 1, resultando em 120. Existem duas regras especiais importantes: 1! é igual a 1, e 0! também é igual a 1, uma convenção matemática crucial para a consistência de fórmulas e algoritmos.
Embora o conceito de fatorial seja simples, sua implementação em linguagens de programação como JavaScript pode apresentar desafios, especialmente quando lidamos com números grandes. Os tipos numéricos padrão em JavaScript têm um limite de precisão, o que significa que fatoriais de números relativamente pequenos (acima de 20, por exemplo) podem resultar em valores imprecisos ou em notação científica, perdendo a exatidão necessária para muitas aplicações. Além disso, a validação da entrada do usuário é fundamental para evitar cálculos incorretos ou erros inesperados no programa.
Este projeto demonstra três níveis de implementação para o cálculo de fatorial, cada um abordando o problema com diferentes graus de complexidade e robustez:
Esta é a forma mais direta de calcular o fatorial, multiplicando sequencialmente os números de 1 até n. É fácil de entender, mas não inclui validações de entrada, nem lida com as limitações de precisão para números grandes, retornando resultados imprecisos ou em notação científica para valores maiores que 20.
function fatorialSimples(n) {
let resultado = 1;
for (let i = 2; i <= n; i++) {
resultado = resultado * i;
}
return resultado;
}Esta abordagem aprimora a versão simples ao adicionar validações básicas para a entrada. Ela verifica se o número é não negativo e se é um inteiro, lançando erros claros caso a entrada seja inválida. Contudo, a lógica de cálculo permanece a mesma, o que significa que as limitações de precisão para números grandes ainda persistem.
function fatorialValidado(n) {
if (n < 0) {
throw new Error("Número não pode ser negativo");
}
if (!Number.isInteger(n)) {
throw new Error("Deve ser um número inteiro");
}
let resultado = 1;
for (let i = 2; i <= n; i++) {
resultado = resultado * i;
}
return resultado;
}Esta é a solução mais completa e robusta, combinando validação rigorosa com a capacidade de lidar com números extremamente grandes. Para números acima de 20, ela utiliza o tipo BigInt do JavaScript, que permite cálculos com inteiros de precisão arbitrária, garantindo resultados exatos mesmo para fatoriais gigantescos. Para números menores, ela otimiza o desempenho usando o tipo numérico padrão.
function fatorial(n) {
if (n < 0 || !Number.isInteger(n)) {
throw new Error("n deve ser um inteiro não negativo");
}
if (n === 0 || n === 1) return 1;
if (n > 20) {
let resultado = 1n;
for (let i = 2n; i <= BigInt(n); i++) {
resultado *= i;
}
return resultado;
}
let resultado = 1;
for (let i = 2; i <= n; i++) {
resultado *= i;
}
return resultado;
}Para explorar este projeto, basta abrir o arquivo index.html em seu navegador web. A interface intuitiva permite que você insira um número e visualize os resultados das três implementações lado a lado, além de poder inspecionar o código-fonte de cada uma através de abas dedicadas. Experimente com diferentes valores, incluindo números negativos, decimais e grandes, para observar o comportamento de cada função.
projeto-fatorial/
├── index.html # Estrutura da página web e interface do usuário
├── script.js # Lógica JavaScript para cálculo e interação da interface
└── style.css # Estilos CSS para a apresentação visual da página