{"id":4788,"date":"2019-03-05T06:00:25","date_gmt":"2019-03-05T04:00:25","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4788"},"modified":"2019-03-12T07:39:06","modified_gmt":"2019-03-12T05:39:06","slug":"las-torres-de-hanoi","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/las-torres-de-hanoi\/","title":{"rendered":"Las torres de Han\u00f3i"},"content":{"rendered":"<p>Las <a href=\"http:\/\/bit.ly\/1NwyvcA\">torres de Hanoi<\/a> es un rompecabeza que consta de tres postes que llamaremos A, B y C. Hay N discos de distintos tama\u00f1os en el poste A, de forma que no hay un disco situado sobre otro de menor tama\u00f1o. Los postes B y C est\u00e1n vac\u00edos. S\u00f3lo puede moverse un disco a la vez y todos los discos deben de estar ensartados en alg\u00fan poste. Ning\u00fan disco puede situarse sobre otro de menor tama\u00f1o. El problema consiste en colocar los N discos en el poste C.<\/p>\n<p>Los postes se pueden representar mediante el siguiente tipo de datos<\/p>\n<pre lang=\"text\"> \n   data Poste = A | B | C\n     deriving Show\n<\/pre>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\"> \n   movimientos :: Integer -> [(Integer,Poste,Poste)]\n   hanoi       :: Integer -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(movimientos n) es la lista de los movimientos para resolver el problema de las torres de hanoi con n discos. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">   \n     \u03bb> movimientos 1\n     [(1,A,C)]\n     \u03bb> movimientos 2\n     [(1,A,B),(2,A,C),(1,B,C)]\n     \u03bb> movimientos 3\n     [(1,A,C),(2,A,B),(1,C,B),(3,A,C),(1,B,A),(2,B,C),(1,A,C)]\n<\/pre>\n<ul>\n<li>(hanoi n) escribe los mensajes de los movimientos para resolver el problema de las torres de hanoi con n discos. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">   \n     \u03bb> hanoi 3\n     Mueve el disco 1 de A a C\n     Mueve el disco 2 de A a B\n     Mueve el disco 1 de C a B\n     Mueve el disco 3 de A a C\n     Mueve el disco 1 de B a A\n     Mueve el disco 2 de B a C\n     Mueve el disco 1 de A a C\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\ndata Poste = A | B | C\n  deriving (Eq, Show)\n\nmovimientos :: Integer -> [(Integer,Poste,Poste)]\nmovimientos n = aux n A B C\n  where  \n    aux n a b c\n      | n == 1    = [(1,a,c)]\n      | otherwise = aux (n-1) a c b ++ (n,a,c) : aux (n-1) b a c\n\nhanoi :: Integer -> IO ()\nhanoi n = \n  putStrLn (unlines (map mensaje (movimientos n)))\n\n-- (mensaje (n.x.y)) es la cadena indicando que el disco n se ha movido\n-- desde el poste x al poste y. Por ejemplo, \n--    \u03bb> mensaje (1,A,B)\n--    \"Mueve el disco 1 de A a B\"\nmensaje :: (Integer,Poste,Poste) -> String\nmensaje (n,x,y) =\n  \"Mueve el disco \" ++ show n ++ \" de \" ++ show x ++ \" a \" ++ show y\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nEn preguntar lo que sabes<br \/>\nel tiempo no has de perder &#8230;<br \/>\nY a preguntas sin respuesta<br \/>\n\u00bfqui\u00e9n te podr\u00e1 responder?<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Las torres de Hanoi es un rompecabeza que consta de tres postes que llamaremos A, B y C. Hay N discos de distintos tama\u00f1os en el poste A, de forma que no hay un disco situado sobre otro de menor tama\u00f1o. Los postes B y C est\u00e1n vac\u00edos. S\u00f3lo puede moverse un disco a la&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","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":[7],"tags":[10,11,312,6,382],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4788"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=4788"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4788\/revisions"}],"predecessor-version":[{"id":4818,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4788\/revisions\/4818"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4788"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4788"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}