[caracas-pm] Divertimento

Ernesto Hernández-Novich emhnemhn at gmail.com
Tue Dec 21 09:46:33 PST 2010


On Fri, 2010-12-17 at 15:38 -0800, Francisco Obispo wrote:
> On Dec 16, 2010, at 8:15 AM, Ernesto Hernández-Novich wrote:
> 
> way() es quien efectivamente "ejecuta" el codigo 
> 
> > ¿Qué calculan wtf y wtffff?
> 
> Factoriales [1]

Así es.

> > ¿Qué calculan hell y hellll?
> 
> Numero de Fibonacci en la posición que le pases de argumento [2]

Así es.

> > ¿Por qué las segundas versiones son más eficientes que las primeras?
> 
> porque el uso de acumuladores sirven de "memoria" para que no tengan que iterar tantas veces

Al usar argumentos acumuladores, las llamadas recursivas pueden retornar
directamente al invocante dado que no quedan cálculos pendientes. Eso se
llama recursión de cola y en lenguajes que saben optimizarla,
independientemente de la profundidad de la recursión, el espacio de pila
es O(1). Calcular el 42-ésimo número de Fibonacci seguramente hará que
se quede sin memoria cualquier máquina con 2-4Gb de RAM, pues debe
utilizarla para representar la pila de ejecución.

Perl5 aún no tiene optimización automática de recursión de cola. Perl5
ofrece una forma especial de goto que permite sustituir el registro de
activacion actual, por el registro de activación de una llamada
recursiva, efectivamente logrando modelar recursión de cola
*manualmente*; si bien el uso de ese estilo de goto está asociado
usualmente a la magia de AUTOLOAD(), puede aplicarse en estos casos.

Por supuesto que tanto el factorial como Fibonacci pueden escribirse
iterativamente para que operen en espacio constante, pero hay algunos
algoritmos que son inherentemente recursivos y que pueden convertirse
parcialmente a recursión de cola para hacerlos ligeramente más
eficientes.

Aún queda explicar por qué la función way() es la que efectivamente hace
que "las cosas pasen" :-)
-- 
Ernesto Hernández-Novich - @iamemhn - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3



More information about the caracas-pm mailing list