Calcolo del fattoriale

Scrivere una funzione che calcola il fattoriale di un numero. Effettuare poi il calcolo del fattoriale per i seguenti numeri: 5, 4 e 2. Si ricorda che il fattoriale di un numero x è dato da:

Il testo di questo esercizio specifica che si vuole una funzione, ossia una procedura che ritorna un valore. Dal momento che il fattoriale si calcola sui numeri interi, questa funzione ha un unico argomento di tipo intero. Il fattoriale di un numero è ancora un intero, per cui la funzione ritorna un intero. Quindi l'intestazione della funzione è:

  static int fatt(int x)

Come nome dell'argomento si è scelto x. Questo è il nome della variabile che verrà creata all'attivazione della funzione, e in cui verrà messo il valore che il programma invia alla procedura. Naturalmente, si poteva scegliere un nome qualsiasi. Per il nome della procedura si è scelto fatt, per ricordare che si tratta della funzione che calcola il fattoriale. Anche questo è un nome arbitrario: si poteva anche scegliere abcd come nome di funzione, soltanto che poi il codice sarebbe risultato meno chiaro.

Resta ora da vedere come è fatta dentro la funzione, ossia quali istruzioni ci vanno messe. Si tratta di moltiplicare tutti i numeri interi da 1 fino al valore di x. Chiaramente, ci serve un ciclo. Iniziamo quindi dicendo che il fattoriale vale 1, e poi a ogni passo di questo ciclo moltiplichiamo il valore corrente del fattoriale per un numero crescente da 1 fino al valore di x. In altre parole, facciamo prima f=1, poi f=f*2 poi f=f*3, ecc. La funzione ritorna poi il valore di f a cui si arriva alla fine del ciclo. Questo metodo è simile a quello usato per calcolare la somma di elementi. Mentre nella somma si parte da 0 e si somma ad ogni passo un elemento, qui si parte da 1 e, ad ogni passo, si moltiplica il valore corrente per uno degli elementi. In più, sappiamo che gli elementi non sono dati, ma sono tutti gli interi da 1 a x.

Il programma completo Fattoriale.java è riportato qui sotto.

/*
  Calcola il fattoriale di un numero
*/

class Fattoriale {
  static int fatt(int x) {
    int i;
    int f=1;

    for(i=1; i<=x; i=i+1) {
      f=f*i;
    }

    return f;
  }

  public static void main(String[] args) {
    int a;
    int r;

    a=5;
    r=fatt(a);
    System.out.println("Il fattoriale di "+a+" vale "+fatt(a));

    a=4;
    System.out.println("Il fattoriale di "+a+" vale "+fatt(a));

    System.out.println("Il fattoriale di 2 vale "+fatt(2));
  }
}

Si noti che la funzione può venire chiamata in diversi modi: si può passare un valore mettendolo prima nella variabile a e poi facendo fatt(a), oppure si può passare direttamente il valore, per esempio facendo fatt(2).

Ci sono due modi possibili con cui il programma può usare il valore di ritorno (quello che la procedura gli manda indietro con return): il primo è mettere il risultato in una variabile usando una istruzione del tipo r=fatt(a); il secondo è quello di scrivere la funzione nel punto esatto in cui il suo valore serve, come si è fatto per la istruzione System.out.println("Il fattoriale di 2 vale "+fatt(2));. In questo caso, serve una istruzione di stampa del valore del fattoriale. Quindi, si può mettere la chiamata della procedura direttamente nel punto in cui va messo il valore del fattoriale.