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.