{"id":4036,"date":"2014-01-22T05:00:31","date_gmt":"2014-01-22T04:00:31","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=4036"},"modified":"2014-01-22T07:12:38","modified_gmt":"2014-01-22T06:12:38","slug":"peh-el-triangulo-de-pascal-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/peh-el-triangulo-de-pascal-en-haskell\/","title":{"rendered":"PeH: El tri\u00e1ngulo de Pascal en Haskell"},"content":{"rendered":"<p>El <a href=\"http:\/\/es.wikipedia.org\/wiki\/Tri\u00e1ngulo_de_Pascal\">tri\u00e1ngulo de Pascal<\/a> es un tri\u00e1ngulo de n\u00fameros<\/p>\n<pre lang=\"shell\">\r\n         1\r\n        1 1\r\n       1 2 1\r\n     1  3 3  1\r\n    1 4  6  4 1\r\n   1 5 10 10 5 1\r\n  ...............\r\n<\/pre>\n<p>construido de la siguiente forma<\/p>\n<ul>\n<li> la primera fila est\u00e1 formada por el n\u00famero 1;\n<li> las filas siguientes se construyen sumando los n\u00fameros adyacentes de la fila superior y a\u00f1adiendo un 1 al principio y al final de la fila.\n<\/ul>\n<p>La construcci\u00f3n del tri\u00e1ngulo de Pascal sirve para ilustrar c\u00f3mo se puede trabajar con listas infinitas en Haskell usando la <a href=\"http:\/\/en.wikipedia.org\/wiki\/Lazy_evaluation\">evaluaci\u00f3n perezosa<\/a> como se muestra en los siguientes ejercicios.<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir la funci\u00f3n\r\n--    pascal :: [[Integer]]\r\n-- tal que pascal es la lista de las l\u00edneas del tri\u00e1ngulo de Pascal. Por\r\n-- ejemplo, \r\n--    ghci> take 6 pascal\r\n--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]\r\n-- ---------------------------------------------------------------------\r\n\r\npascal :: [[Integer]]\r\npascal = [1] : map f pascal\r\n    where f xs = zipWith (+) (0:xs) (xs++[0])\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Escribir la traza del c\u00e1lculo de la expresi\u00f3n\r\n--    take 4 pascal\r\n-- ---------------------------------------------------------------------\r\n\r\n-- Nota: El c\u00e1lculo es\r\n--    take 4 pascal\r\n--    = take 4 ([1] : map f pascal)\r\n--    = [1] : (take 3 (map f pascal))    \r\n--    = [1] : (take 3 (map f ([1]:R1pascal)))\r\n--    = [1] : (take 3 ((f [1]) : map R1pascal)))\r\n--    = [1] : (take 3 ((zipWith (+) (0:[1]) ([1]++[0]) : map R1pascal)))\r\n--    = [1] : (take 3 ((zipWith (+) [0,1] [1,0]) : map R1pascal)))\r\n--    = [1] : (take 3 ([1,1] : map R1pascal)))\r\n--    = [1] : [1,1] : (take 2 (map R1pascal)))\r\n--    = [1] : [1,1] : (take 2 (map ([1,1]:R2pascal)))\r\n--    = [1] : [1,1] : (take 2 ((f [1,1]) : map R2pascal)))\r\n--    = [1] : [1,1] : (take 2 ((zipWith (+) (0:[1,1]) ([1,1]++[0]) : map R2pascal)))\r\n--    = [1] : [1,1] : (take 2 ((zipWith (+) [0,1,1] [1,1,0]) : map R2pascal)))\r\n--    = [1] : [1,1] : (take 2 ([1,2,1] : map R2pascal)))\r\n--    = [1] : [1,1] : [1,2,1] : (take 1 (map R2pascal)))\r\n--    = [1] : [1,1] : [1,2,1] : (take 1 (map ([1,2,1]:R3pascal)))\r\n--    = [1] : [1,1] : [1,2,1] : (take 1 ((f [1,2,1]) : map R3pascal)))\r\n--    = [1] : [1,1] : [1,2,1] : (take 1 ((zipWith (+) (0:[1,2,1]) ([1,2,1]++[0]) : map R3pascal)))\r\n--    = [1] : [1,1] : [1,2,1] : (take 1 ((zipWith (+) [0,1,2,1] [1,2,1,0]) : map R3pascal)))\r\n--    = [1] : [1,1] : [1,2,1] : (take 1 ([1,3,3,1] : map R3pascal)))\r\n--    = [1] : [1,1] : [1,2,1] : [1,3,3,1] : (take 0 (map R3pascal)))\r\n--    = [1] : [1,1] : [1,2,1] : [1,3,3,1] : []\r\n--    = [[1],[1,1],[1,2,1],[1,3,3,1]]\r\n-- en el c\u00e1lculo con R1pascal, R2pascal y R3pascal es la el tri\u00e1ngulo de\r\n-- Pascal si el primero, los dos primeros o los tres primeros elementos,\r\n-- respectivamente. \r\n<\/pre>\n<p><b>Destino<\/b><br \/>\nLa anterior relaci\u00f3n de ejercicios se ha elaborado para <\/p>\n<ul>\n<li>la asignatura de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> y\n<li>la ampliaci\u00f3n del libro <a href=\"http:\/\/www.cs.us.es\/~jalonso\/publicaciones\/Piensa_en_Haskell.pdf\">Piensa en Haskell<\/a>.\n<\/ul>\n<p><b>Fuentes<\/b><\/p>\n<ul>\n<li>Wikipedia. <a href=\"http:\/\/es.wikipedia.org\/wiki\/Tri\u00e1ngulo_de_Pascal\">Tri\u00e1ngulo de Pascal<\/a>.\n<li>Weisstein. <a href=\"http:\/\/mathworld.wolfram.com\/PascalsTriangle.html\">Pascal&#8217;s Triangle<\/a>. En MathWorld.\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>El tri\u00e1ngulo de Pascal es un tri\u00e1ngulo de n\u00fameros 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 &#8230;&#8230;&#8230;&#8230;&#8230; construido de la siguiente forma la primera fila est\u00e1 formada por el n\u00famero 1; las filas siguientes se construyen sumando los n\u00fameros adyacentes de&#8230;<\/p>\n","protected":false},"author":2,"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":[221],"tags":[270,299],"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\/4036"}],"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=4036"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4036\/revisions"}],"predecessor-version":[{"id":4037,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4036\/revisions\/4037"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=4036"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=4036"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=4036"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}