Os pontos chaves nesse desafio são entender como usar a recursão e também utilizar o tipo BigInt para fazer cálculos com números inteiros muito grandes.
Como qualquer outro problema que envolve recursividade, precisamos pensar no caso base. No nosso desafio, o caso base pode ser o fatorial de 0, afinal o !0 = 1. Depois disso precisamos entender como calcular os fatoriais seguintes. Como o fatorial é uma sequência de multiplicações de números inteiros menores, podemos dizer que !5, ou seja, 5 x 4 x 3 x 2 x 1, é igual a 5 x !4. Portanto podemos expressar isso no código da seguinte forma:
function factorial(num) { if (num === 0)
return 1
else
return num * factorial(num - 1)
}
Isso já poderia bastar para calcularmos alguns fatoriais, mas como estamos multiplicando números cada vez maiores logo alcançaremos o MAX_SAFE_INTEGER, ou seja, o maior número (do tipo number) suportado pelo javascript. Para números inteiros maiores que isso podemos utilizar o tipo BigInt. Utilizá-lo é muito simples, basta escrever nossos números com n no final. Mas existe um ponto para ficarmos atentos, o BigInt não pode ser misturado com o tipo Number, então precisamos tratar isso adequadamente no nosso código. Vamos executar isso de forma que seja possível utilizar a função mesmo passando um Number (que será convertido para BigInt, afinal o fatorial utiliza apenas números inteiros). Vejamos como fica o código:
function factorial(num) {
const bigInt = BigInt(num)
if (bigInt === 0n)
return 1n
else
return bigInt * factorial(bigInt - 1n)
}