Tips: cómo resolver el cálculo de un factorial usando recursividad (PHP7)


Por lo general no es muy común que en PHP, y trabajando con sistemas comerciales, tengamos que implementar soluciones recursivas. Pero como tampoco es imposible, les paso un ejemplo. Tengamos en cuenta que aunque parezca obvio:

a) el problema debe ser "un problema recursivo" (que tenga sentido aplicar la recursividad)

b) cuando se trabaja con recursión, debe existir el caso "resoluble directo", que permite salir de la recursión (o entraríamos en loop infinito).

El ejemplo más clásico es el cálculo de un factorial. Si factorial de 5 se calcula 1 x 2 x 3 x 4 x 5, por lo tanto podemos hacer un método que reciba el número a calcular, y posteriormente se va a ir llamando a sí mismo restando 1, hasta llegar al caso "resoluble directo", es decir 0, posteriormente iniciará el retorno recursivo y haciendo el cálculo "al revés" de la invocación inicial (revisar ejecución al final del ejemplo).

PD: de paso, lo hacemos usando PHP 7 o superior. Si bien en este ejemplo no se aprovecha mucho, está bueno que nos empecemos a acostumbrar a las nuevas funcionalidades que trae (como en este caso, la validación de tipos tanto en el input como en el output).

/**
 * Cómo resolver el cálculo de un factorial usando recursividad
 *
 * factorial de 5 = 1 x 2 x 3 x 4 x 5
 *
 */


class Factorial{
  
    public function 
calcular(int $numero) : int
    {
      
        if (
$numero 0) {
          
            
// entro en la recursividad ...
            
$aux $this->calcular($numero 1);
          
            
$calculo $aux $numero;
            echo 
"$aux * $numero = $calculo \n";
          
            return 
$calculo;
        } else {
            
// caso resoluble directamente ...
            
return 1;
        }
    }
}


$factorial = new Factorial();

echo 
"resultado = " $factorial->calcular(5) . " \n";


// Ejecución

php index.php 

1 * 1 = 1 
1 * 2 = 2 
2 * 3 = 6 
6 * 4 = 24 
24 * 5 = 120 
resultado = 120 

Espero que les resulte útil! ;-) 

Espero todas sus dudas! 


2 comentarios:

Unknown dijo...

Hola queria preguntarte que significa el :int en la declaración del método.
Gracias.

Enrique Place dijo...

Que tal Edgar ;-)

Lo comento arriba en el artículo, funcionalidad nueva de PHP7, validación de tipos, tanto de entrada como de salida, obligando a que si retornas, debe ser de tipo integer o de lo contrario fallará

Revisar el ejemplo de la doc

http://php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration

saludos!

Entradas populares