{"id":422,"date":"2010-08-18T13:41:02","date_gmt":"2010-08-18T13:41:02","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/la-funcion-de-ackermann-como-prueba-de-rendimiento\/"},"modified":"2013-03-08T05:53:42","modified_gmt":"2013-03-08T05:53:42","slug":"la-funcion-de-ackermann-como-prueba-de-rendimiento","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/la-funcion-de-ackermann-como-prueba-de-rendimiento\/","title":{"rendered":"La funci\u00f3n de Ackermann como prueba de rendimiento"},"content":{"rendered":"<p>En la entrada <a href=\"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/la-funcion-de-takeuchi-como-banco-de-prueba-para-la-eficiencia\/\">la funci\u00f3n de Takeuchi como banco de prueba para la eficiencia<\/a> us\u00e9 la funci\u00f3n de Takeuchi para comparar la eficiencia de Haskell (GHC) y Lisp (Clisp y LispWorks). En esta voy a hacer lo mismo con la funci\u00f3n de Ackermann.<\/p>\n<p>\nLa <a href=\"http:\/\/en.wikipedia.org\/wiki\/Ackermann_function\">funci\u00f3n de Ackermann<\/a> (tambi\u00e9n llamada funci\u00f3n de Ackermann-P\u00e9ter) es un ejemplo sencillo de <a href=\"http:\/\/es.wikipedia.org\/wiki\/Funci%C3%B3n_recursiva\">funci\u00f3n recursiva<\/a> que no es <a href=\"http:\/\/en.wikipedia.org\/wiki\/Primitive_recursive_function\">primitiva recursiva<\/a>. Definida en 1926 por <a href=\"http:\/\/en.wikipedia.org\/wiki\/Primitive_recursive_function\">Wilhelm Ackermann<\/a>, pero se presenta frecuentemente en la forma propuesta por R\u00f3zsa P\u00e9ter, que es la siguiente<br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=%3Cbr+%2F%3E+A%28m%2Cn%29+%3D%3Cbr+%2F%3E+%5Cleft%5C%7B%3Cbr+%2F%3E+%5Cbegin%7Barray%7D%7Bll%7D%3Cbr+%2F%3E+n%2B1%2C+++++++++++++%26+%5Cmbox%7Bsi%5C+%7D+m%3D0%2C+%5C%5C%3Cbr+%2F%3E+A%28m-1%2C1%29%2C++++++++%26+%5Cmbox%7Bsi%5C+%7D+m%3E0+%5Cmbox%7B%5C+y%5C+%7D+n%3D0+%5C%5C%3Cbr+%2F%3E+A%28m-1%2CA%28m%2Cn-1%29%29%2C+%26+%5Cmbox%7Bsi%5C+%7D+m%3E0+%5Cmbox%7B%5C+y%5C+%7D+n%3E0%3Cbr+%2F%3E+%5Cend%7Barray%7D%3Cbr+%2F%3E+%5Cright.%3Cbr+%2F%3E+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"&lt;br \/&gt; A(m,n) =&lt;br \/&gt; &#92;left&#92;{&lt;br \/&gt; &#92;begin{array}{ll}&lt;br \/&gt; n+1,             &amp; &#92;mbox{si&#92; } m=0, &#92;&#92;&lt;br \/&gt; A(m-1,1),        &amp; &#92;mbox{si&#92; } m&gt;0 &#92;mbox{&#92; y&#92; } n=0 &#92;&#92;&lt;br \/&gt; A(m-1,A(m,n-1)), &amp; &#92;mbox{si&#92; } m&gt;0 &#92;mbox{&#92; y&#92; } n&gt;0&lt;br \/&gt; &#92;end{array}&lt;br \/&gt; &#92;right.&lt;br \/&gt; \" class=\"latex\" \/><br \/>\n<!--more--><\/p>\n<p>\nEn <a href=\"http:\/\/www.chez.com\/emarsden\/downloads\/cl-bench.tar.gz\">The Common-Lisp benchmarking suite<\/a> se plantea la prueba ACKERMANN consistente en medir, a partir de la siguiente definici\u00f3n de la funci\u00f3n de Ackermann,<\/p>\n<pre lang=\"lisp\">\r\n(defun ackermann (m n)\r\n  (declare (type integer m n))\r\n  (cond\r\n    ((zerop m) (1+ n))\r\n    ((zerop n) (ackermann (1- m) 1))\r\n    (t (ackermann (1- m) (ackermann m (1- n))))))\r\n<\/pre>\n<p>el tiempo necesario para calcular (ackermann 3 11). <\/p>\n<p>\nHe realizado la prueba de ACKERMANN en Clisp:<\/p>\n<pre lang=\"shell\">\r\n[1]> (compile-file \"Ackermann.lsp\")\r\n[2]> (load \"Ackermann\")\r\n[3]> (time (ackermann 3 11))\r\nReal time: 50.266396 sec.\r\nRun time: 50.175137 sec.\r\nSpace: 0 Bytes\r\n16381\r\n<\/pre>\n<p>y en LispWorks:<\/p>\n<pre lang=\"shell\">\r\nCL-USER 1 > (compile-file \"Ackermann.lsp\")\r\nCL-USER 2 > (load \"Ackermann\")\r\nCL-USER 3 > (time (ackermann 3 11))\r\nTiming the evaluation of (ACKERMANN 3 11)\r\n\r\nUser time    =  6.140\r\nSystem time  =  0.015\r\nElapsed time =  7.140\r\nAllocation   = 8600 bytes\r\n0 Page faults\r\n16381\r\n<\/pre>\n<p>\nPara hacer la prueba de ACKERMANN en Haskell he definido la funci\u00f3n<\/p>\n<pre lang=\"haskell\">\r\nackermann :: Integer -> Integer -> Integer\r\nackermann 0 n = n+1\r\nackermann m 0 = ackermann (m-1) 1\r\nackermann m n = ackermann (m-1) (ackermann m (n-1))\r\n<\/pre>\n<p>El resultado de la prueba con GHC es el siguiente<\/p>\n<pre lang=\"shell\">\r\n*Main> :set +s\r\n*Main> :set -fobject-code\r\n*Main> :load \"Ackermann.hs\"\r\n*Main> ackermann 3 11\r\n16381\r\n(96.29 secs, 14331472060 bytes)\r\n<\/pre>\n<p>\nEl resumen de los tiempos (en segundos) obtenidos en las pruebas de Takeuchi y de Ackermann es<br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=%3Cbr+%2F%3E+%5Cbegin%7Barray%7D%7B%7Cl%7Cl%7Cr%7Cr%7C%7D+%5Chline%3Cbr+%2F%3E+Lenguaje+%26+Version++++++++++%26+Takeuchi+%26+Ackermann+%5C%5C+%5Chline%3Cbr+%2F%3E+Haskell++%26+GHC%5C+6.12.1++++++%26++++0.02++%26++96.29++++%5C%5C+%5Chline%3Cbr+%2F%3E+Lisp+++++%26+CLISP%5C+2.44.1++++%26+1006.67++%26++50.17++++%5C%5C+%5Chline%3Cbr+%2F%3E+Lisp+++++%26+LispWorks%5C+5.1.1+%26++169.92++%26+++7.14++++%5C%5C+%5Chline%3Cbr+%2F%3E+%5Cend%7Barray%7D%3Cbr+%2F%3E+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"&lt;br \/&gt; &#92;begin{array}{|l|l|r|r|} &#92;hline&lt;br \/&gt; Lenguaje &amp; Version          &amp; Takeuchi &amp; Ackermann &#92;&#92; &#92;hline&lt;br \/&gt; Haskell  &amp; GHC&#92; 6.12.1      &amp;    0.02  &amp;  96.29    &#92;&#92; &#92;hline&lt;br \/&gt; Lisp     &amp; CLISP&#92; 2.44.1    &amp; 1006.67  &amp;  50.17    &#92;&#92; &#92;hline&lt;br \/&gt; Lisp     &amp; LispWorks&#92; 5.1.1 &amp;  169.92  &amp;   7.14    &#92;&#92; &#92;hline&lt;br \/&gt; &#92;end{array}&lt;br \/&gt; \" class=\"latex\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la entrada la funci\u00f3n de Takeuchi como banco de prueba para la eficiencia us\u00e9 la funci\u00f3n de Takeuchi para comparar la eficiencia de Haskell (GHC) y Lisp (Clisp y LispWorks). En esta voy a hacer lo mismo con la funci\u00f3n de Ackermann. La funci\u00f3n de Ackermann (tambi\u00e9n llamada funci\u00f3n de Ackermann-P\u00e9ter) es un ejemplo&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[5,92,95],"tags":[97,270,283,284],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/422"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=422"}],"version-history":[{"count":10,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/422\/revisions"}],"predecessor-version":[{"id":3036,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/422\/revisions\/3036"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=422"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}