quinta-feira, 21 de janeiro de 2010

Programação Incondicional VI

No último artigo dessa série eu criei uma função recursiva para calcular o fatorial sem usar ifs. Porque escrevi em Java, a solução acabou complicada. Decidi tentar em Perl que, sendo uma linguagem dinâmica, permite expressar melhor esse tipo de enjambração.

Comecei com o fatorial:

use integer;

sub fact {
my $n=shift;

(sub {1},
sub {
my $n=shift;
$n*fact($n-1);
})[-1*((1-$n)>>31)]->($n);
}

print fact($ARGV[0]);

Eu criei uma função que usa uma lista de referências a funções e decide qual executar conforme o índice -1*((1-$n)>>31). A função da posição zero apenas retorna o valor 1 e a função da posição 1 retorna $n multiplicado pela chamada recursiva à função fact().

A solução é bastante mais simples que a escrita em Java. E também tem uma estrutura que se parece com a notação matemática.



A estrutura para a série de Fibonacci é igual.

use integer;

sub fib {
my $n=shift;

(sub {shift},
sub {
my $n=shift;
fib($n-1)+fib($n-2);
})[-1*((1-$n)>>31)]->($n);
}

print fib($ARGV[0]);

E isso revela que talvez não seja difícil escrever uma função para gerar funções recursivas desse tipo...

Nenhum comentário: