Como resolver?

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.

Resolução

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)
}