La función de Ackermann como prueba de rendimiento

En la entrada la función de Takeuchi como banco de prueba para la eficiencia usé la función de Takeuchi para comparar la eficiencia de Haskell (GHC) y Lisp (Clisp y LispWorks). En esta voy a hacer lo mismo con la función de Ackermann.

La función de Ackermann (también llamada función de Ackermann-Péter) es un ejemplo sencillo de función recursiva que no es primitiva recursiva. Definida en 1926 por Wilhelm Ackermann, pero se presenta frecuentemente en la forma propuesta por Rózsa Péter, que es la siguiente
<br /> A(m,n) =<br /> \left\{<br /> \begin{array}{ll}<br /> n+1,             & \mbox{si\ } m=0, \\<br /> A(m-1,1),        & \mbox{si\ } m>0 \mbox{\ y\ } n=0 \\<br /> A(m-1,A(m,n-1)), & \mbox{si\ } m>0 \mbox{\ y\ } n>0<br /> \end{array}<br /> \right.<br />

En The Common-Lisp benchmarking suite se plantea la prueba ACKERMANN consistente en medir, a partir de la siguiente definición de la función de Ackermann,

el tiempo necesario para calcular (ackermann 3 11).

He realizado la prueba de ACKERMANN en Clisp:

y en LispWorks:

Para hacer la prueba de ACKERMANN en Haskell he definido la función

El resultado de la prueba con GHC es el siguiente

El resumen de los tiempos (en segundos) obtenidos en las pruebas de Takeuchi y de Ackermann es
<br /> \begin{array}{|l|l|r|r|} \hline<br /> Lenguaje & Version          & Takeuchi & Ackermann \\ \hline<br /> Haskell  & GHC\ 6.12.1      &    0.02  &  96.29    \\ \hline<br /> Lisp     & CLISP\ 2.44.1    & 1006.67  &  50.17    \\ \hline<br /> Lisp     & LispWorks\ 5.1.1 &  169.92  &   7.14    \\ \hline<br /> \end{array}<br />