Que isso! Sensacional sua abordagem e análise, não tinha pensado em tantos detalhes assim. Com base em alguns pontos que você evidenciou, fiz algumas melhorias no meu código:
const calculeFactorial = (...numbers) => {
const factorials = {};
let factorial = BigInt(1);
for (const number of numbers) {
// para sequencias numéricas que possuem valores repetidos, evitamos
// recalcular o mesmo valor, checando se ele já foi calculado. Caso não, seguimos.
if (!(number in factorials)) {
// checa se o valor atual que será calculado, possui um antecessor já calculado.
// seguindo a lógica evidenciada por você: 4! = 4 * 3!
if (number - 1 in factorials) {
factorials[number] = BigInt(number) * factorials[number - 1];
continue;
}
for (let i = BigInt(number); i >= 1; i--) factorial *= i;
factorials[number] = factorial;
factorial = BigInt(1); // reseta a variável
}
}
return factorials;
};