Quello che succede è che la funzione viene chiamata di nuovo, sotto il controllo della prima chiamata, e dopo che ci sono due invocazioni di factorial
attive contemporaneamente (ma il primo è in attesa del il secondo da restituire). Ognuno di essi ha una propria copia di n
: l'invocazione subordinata ha n == 2
mentre l'invocazione originale ha ancora n == 3
. L'invocazione subordinata si chiama quindi un'altra volta, e così via, fino a quando non ci sono quattro versioni della funzione in memoria (ma i primi tre sono inattivi, in attesa che l'ultimo ritorni).
I valori delle variabili e gli indirizzi di ritorno di tutte quelle invocazioni vengono mantenuti nello stack delle chiamate e scompaiono automaticamente quando viene restituita una chiamata. (Questo è il motivo per cui una ricorsione troppo nidificata può causare il fenomeno di questo sito: l'overflow dello stack.)
Un buon modo per capire cosa succede realmente quando viene chiamata una funzione ricorsiva è simulare lo stack di chiamate con carta e penna, scrivendo quali versioni di n
ci sono a in qualsiasi momento e quali sono i loro valori. Una chiamata a factorial 3
è la giusta dimensione per quell'esercizio.