Allora andiamo più piano...
fattoriale è la funzione che calcola il fattoriale dell'argomento passato come parametro.
Quindi, quando io eseguo da un programma che ha definita tale funzione, la seguente riga di codice
codice:
valore = fattoriale(x);
nella variabile valore ottengo il fattoriale di x. fattoriale quindi è una funzione che riceve un parametro e ne calcola il fattoriale (un po' come sin(x) calcola il seno del suo argomento).
Le istruzioni che vengono eseguite, ad ogni passo, sono sempre le stesse, ma ciò che cambia è l'argomento, di volta in volta, passato.
Osserva bene il codice:
codice:
int fattoriale(int numero) {
Definisco la funzione e affermo che prende un parametro intero (numero) di cui voglio calcolare il fattoriale.
codice:
...
if (!numero) {
Se numero vale 0 (questo perchè in C/C++ lo zero è considerato FALSE, mentre qualsiasi altro valore rappresenta il TRUE) allora assegno alla variabile f il valore 1. Siamo tutti d'accordo che il fattoriale di 0 vale 1.
codice:
else
f = numero * fattoriale(numero - 1);
altrimenti (numero è diverso da 0), calcolo il suo fattoriale utilizzando proprio la definizione: alla variabile f assegno il valore di numero moltiplicato per il fattoriale di (numero - 1).
E' proprio qui che viene effettuato il decremento di numero: viene chiamata di nuovo la funzione per il calcolo, ma con un valore decrementato di 1!!
Quello che succede in memoria credo che non ti sia di interesse, in questo momento. Quello che devi sapere è che viene chiamata una copia delle funzione stessa alla quale viene passato un valore ovviamente diverso da quello originale (infatti viene decrementato di uno). Questa farà tutti i suoi conti e ritornerà il risultato voluto che verrà moltiplicato per il valore che attualmente ha la variabile numero.
La succesione di chiamate, per esempio, per il valore 2 è la seguente:
codice:
PASSO 1 (prima copia della funzione): f = 2 * fattoriale(1);
PASSO 2 (seconda copia della funzione): f = 1 * fattoriale(0);
PASSO 3 (terza copia della funzione): f = 1 (fattoriale di 0)
PASSO 4 (torno alla seconda copia restituendo 1): f = 1 * 1;
PASSO 5 (torno alla prima copia restituendo 1): f = 2 * 1;
PASSO 6: ritorno il risutlato finale: 2.
Spero di essere stato più chiaro e preciso di prima.
Ciao.