[Perl] recursividad en perl

Ivan Chavero ichavero en uach.mx
Lun Mayo 9 16:07:15 CDT 2005


Gunnar ilustra muy bién los problemas de tu script. 
solamenter un comentario, he hecho algunas pruebas con recursividad en
perl y no es precísamente su fuerte, lo bueno es que TIMTOWTDI y hay
alternativas a la recursividad:

#No recursivo
sub fact {
    my $n = shift;
    my $i = $n-1;
    while($i){
        $n = $n * ($i--);
    }
    return $n;
}






El lun, 09-05-2005 a las 13:23 -0500, Gunnar Wolf escribió:
> Jorge Alejandro Adell dijo [Mon, May 09, 2005 at 03:04:40PM -0300]:
> > segun mi pequeño script para verificar si perl admite la recursividad,
> > vi que no es posible esto. O tambien puede ser que este haciendo algo
> > mal.
> > Puede ser que perl no admita la recursividad.
> > Este fue mi experimento para verificarlo.
> > 
> > sub factorial
> > {
> > $num = $_[0] | 0;
> > if ( $num != 1)
> > {
> > $resultado = $num * factorial($num-1);
> > }
> > }
> > 
> > print factorial(5);
> 
> Tu funcion tiene varios problemitas. El primero es con el 'ambito de
> las variables - En Perl, las variables son globales por default, por
> lo que lo que calculas en $resultado es sobreescrito a cada
> recursion. Puedes especificar un 'ambito l'exico con my.
> 
> En segundo lugar, no est'as especificando qu'e va a regresar - Le
> agrego un 'return $resultado;' para que lo haga.
> 
> En tercer lugar, est'as usando un OR binario ( | ) en vez de uno
> booleano ( || ), lo cual no hace demasiada diferencia... Pero es
> err'oneo :)
> 
> Puedes reescribir tu funcion asi, y funciona correctamente:
> (aprovecho para indentarla, le da mucho mayor claridad)
> 
> sub factorial
> {
>     my ($num, $resultado);
>     $num = $_[0] || 0;
>     if ( $num != 1)
>     {
> 	$resultado = $num * factorial($num-1);
>     }
>     return $resultado;
> }
> 
> print factorial(5);
> 
> As'i funciona correctamente. Ahora, hag'amoslo un poco m'as conciso:
> 
> sub factorial {
>     my $num;
>     $num = $_[0];
>     return ($num <= 1) ? 1 : $num*factorial($num-1);
> }
> 
> Saludos!
> 
-- 



Más información sobre la lista de distribución Perl