Las virtudes de la programción funcional
Ernesto Hernandez-Novich
emhn at telcel.net.ve
Fri Nov 29 07:33:39 CST 2002
On Mon, 25 Nov 2002, Ernesto Hernandez-Novich wrote:
> Queda como ejercicio para el lector escribir una función que
> retorne una función recursiva.
Una función que retorna el factorial y otra que retorna el n-ésimo
número de Fibonacci.
#!/usr/bin/perl -w
# fac(n) = n * n-1 * n-2 * ... * 2 * 1
sub recfac {
my $f;
my $h = sub { my $n = shift;
return($n > 0 ? $n * $f->($n - 1)
: 1);
};
$f = $h;
return $h;
}
# fib(n) = fib(n-1) + fib(n-2), fib(0) = fib(1) = 1
sub recfib {
my $f;
my $h = sub { my $n = shift;
return($n > 1 ? $f->($n - 1) + $f->($n - 2)
: 1);
};
$f = $h;
return $h;
}
my $factorial = recfac();
print $factorial->(6); # 720
my $fibonacci = recfib();
map { print $fibonacci->($_)," " } (0..10); # 1 1 2 3 5 8 13 21 34 55 89
print "\n"; #
El truco es crear una clausura con una variable definida por nombre
($f) pero que aún no tiene valor, se construye la función ($h) usando
la variable $f como referencia a una función. Una vez definida la
función $h, se hace que $f tenga el mismo valor que $h, i.e. se haga
referencia a la misma función. Finalmente se retorna la referencia a la
función $h (o $f, sería lo mismo).
--
Ernesto Hernández-Novich - Running Linux 2.4.19 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3
------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------
More information about the caracas-pm
mailing list