[Perl] recursividad en perl
Gunnar Wolf
gwolf en gwolf.org
Lun Mayo 9 13:23:37 CDT 2005
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!
--
Gunnar Wolf - gwolf en gwolf.org - (+52-55)1451-2244 / 5554-9450
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
Más información sobre la lista de distribución Perl