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.