Sei sulla pagina 1di 2

FUNZIONI RICORSIVE nel Linguaggio C

DEFINIZIONE: Una funzione è detta “ricorsiva” quando richiama se stessa (recursive call).

ESEMPIO
void Funz_ricorsiva()
{ recursive
......... call
Funz_ricorsiva();
.........
}

int main()
{
.........
Funz_ricorsiva();
.........
}

PREMESSA
NON è la maniera più performante per ottenere un codice veloce nell’esecuzione.

In genere consente di avere un codice più compatto.

APPLICAZIONE
Un esempio di applicazione delle funzioni ricorsive può essere il calcolo del Fattoriale di un numero.

L’espressione matematica n! = n ∙ (n-1) ∙ (n-2) … 1 dove n è un numero intero positivo


Il risultato è dato dal prodotto di tutti i numeri interi decrescenti a partire da n per arrivare ad 1.

Il codice C per calcolare tale Fattoriale di n è il seguente:

1. #include <stdio.h>
2.
3. int fattoriale(int n) {
4. if (n == 0) {
5. return 0;
6. } recursive
7. else if ( n == 1) {
8. return 1;
call
9. }
10. else {
11. return n*fattoriale(n-1);
12. }
13. }
14.
15. int main() {
16. int n, result;
17. printf("Digitare il numero intero positivo\n");
18. printf("del quale si vuole calcolare il Fattoriale: ");
19. scanf("%d",&n);
20. result = fattoriale(n);
21. printf("il Fattoriale di %d (ossia %d! ) è: %d", n, n, result);
22. }

Come si può notare dal codice (rigo 7), la funzione ricorsiva necessita di una condizione per interrompere il
ciclo di chiamate dopo aver effettuato gli n cicli. Se la condizione presente al rigo 7 è verificata, viene eseguito
il comando 'return 1' che blocca la ricorsività delle chiamate a funzione.

Lezioni di INFORMATICA Prof Donato Greco @ 2020 Pag. 1 di 2


Supponendo che l’utente immetta in numero n = 2 avremo una prima chiamata a fattoriale(2). Poiché
non è verificata né la condizione del rigo 4, né quella del rigo 7, verrà eseguito il codice al rigo 11, ossia

(1) return 2 ∙ fattoriale(1) poiché n=2 e quindi n-1=1

ma questo comporta che venga PRIMA calcolato il valore di fattoriale(1) .

In questo caso, però, la condizione al rigo 7 risulta verificata, quindi verrà eseguito il codice al rigo 8, che
interrompe il ciclo ricorsivo. Avendo ottenuto che fattoriale(1) = 1 il valore restituito dalla (1) è

(2) return 2 ∙ 1 ossia 2

Tale valore verrà quindi acquisito dalla variabile result (rigo 20) e si procederà all’output a console (rigo 21).

Analogo ragionamento va fatto per qualsivoglia altro valore inserito dall’utente del programma, ripetendo il
ciclo per il numero adeguato di volte fino a giungere ad 1.

Il ruolo cruciale nelle funzioni ricorsive è svolto pertanto dalla presenza di una condizione (quindi dalla
presenza di una istruzione IF o similare) che, se verificata, interromperà il ciclo ricorsivo.

Per comprendere come è possibile gestire adeguatamente la condizione IF per garantire l’uscita dal ciclo
ricorsivo della funzione, riporto lo stesso codice di prima con alcune modifiche che lo rendono più compatto.

1. #include <stdio.h>
2.
3. int fattoriale(int n) {
4. if (n-1) { recursive
5. return n*fattoriale(n-1); call
6. }
7. return 1;
8. }
9.
10. int main() {
11. int n, result;
12. printf("Digitare il numero intero positivo e DIVERSO da zero\n");
13. printf("del quale si vuole calcolare il Fattoriale: ");
14. scanf("%d",&n);
15. result = fattoriale(n);
16. printf("il Fattoriale di %d (ossia %d! ) è: %d", n, n, result);
17. }

In questo caso la condizione al rigo 4 è VERA sempre quando n-1 ≠ 0 che si traduce in n ≠ 1 . Se invece
abbiamo che n=1 verrà eseguita l’istruzione al rigo 7, cioè 'return 1' che interrompe il ciclo ricorsivo.

Possiamo rappresentare la ricorsività come un calcolo a ritroso

return 4*fattoriale(3) = 24 4*6 = 24


return 3*fattoriale(2) = 6 3*2 = 6
return 2*fattoriale(1) = 2 2*1 = 2
return 1 1

Lezioni di INFORMATICA Prof Donato Greco @ 2020 Pag. 2 di 2

Potrebbero piacerti anche