Efectivamente, la posibilidad más instructiva para el problema de la sucesión de fibonacci es utilizando la ayuda de las matemáticas y su implementación computacional, es decir, generar la función recurrente del problema como se menciona abajo:
macgregor escribiste:el numero de fibonacci se calcula comof(1)=1 caso base
f(2)=1 caso base
f(n)=f(n-1)+f(n-2) caso recursivo
Aqui hay 2 cosas importantes... la función recurrente está correcta, pero... le hace falta su condición de comienzo y los casos bases dados, estan "correctos" si así se quiere ver... pero... falta uno muy importante: f(0). Entonces nuestra recurrencia quedaría planteada de la siguiente manera:
- Código: Seleccionar todo
f(0) = 0;
f(1) = 1;
f(n) = f(n-1) + f(n-2) cuando n >= 2
Consta de 2 casos base (los cuales computacionalmente detendrán las llamadas recursivas) y luego viene el caso recursivo o matemáticamente llamado también caso hipotético (es simple inducción matemática), donde se asume que la sucesión se calcula a partir de los 2 valores anteriores dados a la función.
Esto nos permite ver que computacionalmente, generaremos una función, cuyos valores de parada serán, al recibir un número con valor 0 ó 1, y que mientras no se cumpla dicha condición, se llame asímisma con los valores anteriores.
Veamos la implementación dada:
macgregor escribiste:
- Código: Seleccionar todo
sub fibo
{
my $n=@_[0];
if ($n==0){return 1;}
else
{
if ($n==1){return 1;}
else
{
return( fibo($n-1)+fibo($n-2) );
{
}
}
Bueno, si se prueba dicho código utilizando use warnings se podrá observar que el intérprete nos advertirá sobre una pequeña falla de asociación de valores: intentaste utilizar un slice en vez de un simple valor escalar sobre los parámetros enviados.
Funciona.... claro... por qué? porque dicho slice a fin de cuentas regresa un valor... pero ¿sabes que retorna? retorna una lista, una lista con un solo valor (que escalarmente es un 1, así que cuidado).
La otra cuestión es... no hay necesidad de separar los 2 casos base, y generar 4 condiciones, con 1 sola condición es suficiente, por lo tanto el código quedaría de la siguiente manera:
- Código: Seleccionar todo
sub fib {
my $n = shift; # o $_[0]
return $n if ( $n == 0 or $n == 1 ); #casos base
return fib( $n-1 ) + fib( $n-2 ); #caso recursivo
}
El orden de dicho algoritmo es O(n^n), por lo tanto como se mencionó en el post de macgregor, crece exponencialmente de acuerdo al parámetro mandado. Dependiendo de la pila máxima soportada, es el nivel de recursividad que el algoritmo podrá soportar.
Recomendaciones:
No es comercial pero... es 100 no.... 10000% recomendado el nuevo libro Higher Order Perl del autor Mark Jason Dominus, editorial Morgan Kauffman (or something like that), el cual tiene como finalidad aplicar conocimientos del paradigma funcional en el lenguaje de programación Perl. Así que esto de la recursividad es un tópico en el libro, y una técnica muy buena para "salvar" recursos llamada Memoization.
Saludos,