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