Algoritmo Che Calcolare Il Fattoriale Di Un Numero

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

  1. Combinatoria: Calcolo di permutazioni (n!/(n-k)!) e combinazioni (n!/(k!(n-k)!))
  2. Probabilità: Distribuzione di Poisson e calcoli di probabilità discreta
  3. Algoritmi: Generazione di permutazioni e soluzioni di problemi NP-completi
  4. 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)
512030.001
103,628,80070.002
151,307,674,368,000130.005
202,432,902,008,176,640,000190.012
221.124 × 1021220.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:

Errori Comuni da Evitare

  1. Stack Overflow: Con la ricorsione su n > 10000 senza ottimizzazione
  2. Precisione: Usare numeri floating-point invece di interi per n > 22
  3. Input Validation: Non controllare se l'input è negativo o non intero
  4. 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;
}

Leave a Reply

Your email address will not be published. Required fields are marked *