Lecciones de PHP - Lección 9 - Recursión
En la lección anterior vimos cómo usar funciones en PHP. Ahora vamos a profundizar un poco más en su uso. Hasta ahora, hemos trabajado con funciones de esta forma:
<?php
function myFunction(){ // definición de la función
}
$x = myFunction(); // llamada a la función
?>
¿Pero qué ocurre si llamamos a una función desde dentro de sí misma?
<?php
function myFunction(){
$x = myFunction();
...
return $x;
}
$y = myFunction();
Una llamada a una función desde su propio cuerpo se llama recursión. Aunque suena complejo en teoría, en la práctica es mucho más sencillo.
Vamos a crear una función para calcular potencias. Como recordarás del álgebra, elevar un número a una potencia significa multiplicarlo por sí mismo varias veces. En PHP esto se ve así:
<?php
function myDegree($x, $n){
if($n == 0){
return 1;
}
if($n < 0){
return myDegree(1/$x, -$n); // -$n cambia el signo a positivo
}
return $x * myDegree($x, $n-1); // llamada recursiva
}
$y = myDegree(2, -4); // primera llamada a la función
print $y;
?>
Vamos a analizar esta función en detalle. Recuerda que después de la instrucción return, la función termina y devuelve el valor indicado.
Primero: if($n == 0) — si el exponente es 0, devolvemos 1. Esto es correcto porque cualquier número elevado a 0 es 1.
Segundo: if($n < 0) — si el exponente es negativo, lo convertimos en positivo y usamos el inverso del número. Esto también es correcto según la definición matemática de potencias con exponente negativo.
Finalmente, si el exponente no es 0 ni negativo, multiplicamos el número por el resultado de llamar nuevamente a la función con el exponente reducido en 1.
Veamos cada iteración (repetición) de esta función:
1. Exponente -4, número 2.
Se ejecuta el segundo if, el número se convierte en fracción, y el exponente en positivo.
2. Exponente 4, número 0.5.
Se entra en la recursión:
return $x * myDegree($x, $n-1)
3. Exponente 3, número 0.25.
4. Exponente 2, número 0.125.
5. Exponente 1, número 0.0625.
Ahora se activa el primer if, se devuelve 1 y la función va multiplicando hacia atrás todos los resultados anteriores. Ya no hay más recursión.
Veamos otro ejemplo: el factorial. El factorial de un número n es el producto de todos los enteros positivos desde 1 hasta n. Por ejemplo, el factorial de 6 es 6×5×4×3×2×1 = 720. Como ya habrás adivinado, lo haremos con recursión.
<?php
function myRecursion($x){
if($x == 1){
return $x;
}
return $x * myRecursion($x-1);
}
$y = myRecursion(8);
print $y;
?>
Este ejemplo es aún más simple que el anterior, así que te dejo a ti el análisis de cómo cambian los parámetros en cada llamada recursiva.