Calcolatore del Fattoriale
Inserisci un numero intero non negativo per calcolare il suo fattoriale e visualizzare la progressione matematica.
Guida Completa all’Algoritmo per il Calcolo del Fattoriale di un Numero
Il fattoriale di un numero intero non negativo n, indicato con n!, è il prodotto di tutti i numeri interi positivi minori o uguali a n. Questa operazione matematica fondamentale ha applicazioni in numerosi campi come la combinatoria, la teoria della probabilità e l’analisi algoritmica.
Definizione Matematica
La definizione formale del fattoriale è:
- 0! = 1 (per definizione)
- n! = n × (n-1)! per n > 0
Metodi di Calcolo
Esistono principalmente due approcci algoritmici per calcolare il fattoriale:
1. Metodo Iterativo
Utilizza un ciclo per moltiplicare progressivamente i numeri:
function fattorialeIterativo(n) {
let risultato = 1;
for (let i = 2; i <= n; i++) {
risultato *= i;
}
return risultato;
}
2. Metodo Ricorsivo
Sfrutta la definizione matematica chiamando la funzione stessa:
function fattorialeRicorsivo(n) {
if (n === 0) return 1;
return n * fattorialeRicorsivo(n - 1);
}
Confronto tra i Metodi
| Criterio | Metodo Iterativo | Metodo Ricorsivo |
|---|---|---|
| Efficienza | O(n) - Nessun overhead | O(n) - Overhead chiamate funzione |
| Memoria | Costante (O(1)) | Lineare (O(n)) - Stack calls |
| Leggibilità | Buona | Eccellente (riflette la definizione) |
| Limite pratico | ~105 (dipende da JS) | ~104 (stack overflow) |
Applicazioni Pratiche
- Combinatoria: Calcolo di permutazioni (n!/(n-k)!) e combinazioni (n!/(k!(n-k)!))
- Probabilità: Distribuzione di Poisson e calcoli di probabilità discreta
- Algoritmi: Generazione di permutazioni e soluzioni di problemi NP-completi
- Fisica: Meccanica statistica e termodinamica (funzione di partizione)
Limiti Computazionali
In JavaScript, il valore massimo sicuro per i numeri interi è 253-1 (Number.MAX_SAFE_INTEGER). Questo limita il calcolo esatto del fattoriale a n=22 (23! supera questo limite):
| n | n! | Cifre | Tempo JS (ms) |
|---|---|---|---|
| 5 | 120 | 3 | 0.001 |
| 10 | 3,628,800 | 7 | 0.002 |
| 15 | 1,307,674,368,000 | 13 | 0.005 |
| 20 | 2,432,902,008,176,640,000 | 19 | 0.012 |
| 22 | 1.124 × 1021 | 22 | 0.025 |
Ottimizzazioni Avanzate
Per valori molto grandi (n > 22), si possono utilizzare:
- Librerie BigInt: Permettono calcoli con precisione arbitraria
- Approssimazione di Stirling: n! ≈ √(2πn)(n/e)n per stime
- Memoization: Salvataggio di risultati precedenti per ottimizzare calcoli ripetuti
- Parallelizzazione: Suddivisione del calcolo per processori multi-core
Fonti Autorevoli
Per approfondimenti accademici sul fattoriale e gli algoritmi correlati:
- MathWorld - Factorial (Wolfram Research)
- NIST - Algorithmic Number Theory (PDF)
- Stanford CS161 - Algorithm Design
Errori Comuni da Evitare
- Stack Overflow: Con la ricorsione su n > 10000 senza ottimizzazione
- Precisione: Usare numeri floating-point invece di interi per n > 22
- Input Validation: Non controllare se l'input è negativo o non intero
- Performance: Ricalcolare ripetutamente gli stessi valori senza caching
Implementazione in Altri Linguaggi
Esempi comparativi:
Python (con memoization):
from functools import lru_cache
@lru_cache(maxsize=None)
def factorial(n):
return 1 if n <= 1 else n * factorial(n - 1)
Java (iterativo con BigInteger):
import java.math.BigInteger;
public static BigInteger factorial(int n) {
BigInteger result = BigInteger.ONE;
for (int i = 2; i <= n; i++)
result = result.multiply(BigInteger.valueOf(i));
return result;
}