Lezioni di PHP - Lezione 9 - Ricorsione
Nella lezione precedente abbiamo imparato a usare le funzioni in PHP. Ora approfondiremo un po’ di più il loro utilizzo. Finora abbiamo visto funzioni di questo tipo:
<?php function myFunction(){ // definizione della funzione } $x = myFunction(); // chiamata della funzione ?>
Ma cosa succede se chiamiamo una funzione all’interno di se stessa?
<?php function myFunction(){ $x = myFunction(); ... return $x; } $y = myFunction();
Questo tipo di chiamata — quando una funzione invoca se stessa — si chiama ricorsione. Può sembrare complicato in teoria, ma in pratica è molto più semplice.
Creiamo, per esempio, una funzione per calcolare la potenza di un numero. Dalla matematica sappiamo che una potenza di grado n significa moltiplicare il numero per se stesso n volte. In PHP può essere fatto così:
<?php function myDegree($x, $n){ if($n == 0){ return 1; } if($n < 0){ return myDegree(1/$x, -$n); // -$n inverte il segno da negativo a positivo } return $x * myDegree($x, $n-1); // chiamata ricorsiva } $y = myDegree(2, -4); // prima chiamata della funzione print $y; ?>
Analizziamo questa funzione passo dopo passo. Ricorda che dopo return
la funzione smette di eseguire codice e restituisce il valore indicato.
Il primo if($n == 0)
controlla se l’esponente è zero: in tal caso restituisce 1 (qualsiasi numero elevato alla potenza 0 è uguale a 1).
Il secondo if($n < 0)
gestisce le potenze negative: trasformiamo l’esponente in positivo e prendiamo il reciproco del numero, come previsto dalla definizione matematica.
Infine, se l’esponente non è né zero né negativo, la funzione richiama se stessa riducendo l’esponente di 1, moltiplicando il numero per il risultato della chiamata successiva.
Vediamo le iterazioni passo per passo:
1. Esponente = -4, numero = 2.
Viene eseguito il secondo if
, il numero diventa frazione e l’esponente positivo.
2. Esponente = 4, numero = 0,5.
L’esponente è positivo e diverso da zero, quindi viene eseguita questa riga:
return $x * myDegree($x, $n-1);
3. Esponente = 3, numero = 0,25.
4. Esponente = 2, numero = 0,125.
5. Esponente = 1, numero = 0,0625.
Qui scatta il primo if
, la funzione restituisce 1 e i valori vengono moltiplicati a ritroso, completando la ricorsione.
Un altro esempio classico di ricorsione è il calcolo del fattoriale. Il fattoriale di un numero n è il prodotto di tutti i numeri da 1 a n. Ad esempio, per 6 il risultato è 6×5×4×3×2×1 = 720. Usiamo la ricorsione anche qui:
<?php function myRecursion($x){ if($x == 1){ return $x; } return $x * myRecursion($x-1); } $y = myRecursion(8); print $y; ?>
Questo esempio è ancora più semplice del precedente. Ti lascio analizzare da solo come cambiano i parametri della funzione myRecursion()
a ogni chiamata.