{"id":4041,"date":"2014-01-23T06:00:38","date_gmt":"2014-01-23T05:00:38","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=4041"},"modified":"2014-01-22T07:31:23","modified_gmt":"2014-01-22T06:31:23","slug":"peh-lista-de-factoriales-perezosa-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/peh-lista-de-factoriales-perezosa-en-haskell\/","title":{"rendered":"PeH: Lista de factoriales perezosa en Haskell"},"content":{"rendered":"<p>Continuando con la serie sobre evaluaci\u00f3n perezosa en Haskell, otro ejemplo cl\u00e1sico es la lista de los factoriales: 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, &#8230;<\/p>\n<p>En la siguiente relaci\u00f3n se proponen distintas definiciones para calcular la lista de factoriales.<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    factoriales1 :: [Integer]\r\n-- tal que factoriales1 es la lista de los factoriales. Por ejemplo,\r\n--    take 10 factoriales1  ==  [1,1,2,6,24,120,720,5040,40320,362880]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactoriales1 :: [Integer]\r\nfactoriales1 = [factorial n | n <- [0..]]\r\n\r\n-- (factorial n) es el factorial de n. Por ejemplo,\r\n--    factorial 4  ==  24\r\nfactorial :: Integer -> Integer\r\nfactorial n = product [1..n]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir, usando zipWith, la funci\u00f3n\r\n--    factoriales2 :: [Integer]\r\n-- tal que factoriales2 es la lista de los factoriales. Por ejemplo,\r\n--    take 10 factoriales2  ==  [1,1,2,6,24,120,720,5040,40320,362880]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactoriales2 :: [Integer]\r\nfactoriales2 = 1 : zipWith (*) [1..] factoriales2\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Comparar el tiempo y espacio necesarios para calcular\r\n-- las siguientes expresiones\r\n--    let xs = take 3000 factoriales1 in (sum xs - sum xs)\r\n--    let xs = take 3000 factoriales2 in (sum xs - sum xs)\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> let xs = take 3000 factoriales1 in (sum xs - sum xs)\r\n--    0\r\n--    (17.51 secs, 5631214332 bytes)\r\n--    ghci> let xs = take 3000 factoriales2 in (sum xs - sum xs)\r\n--    0\r\n--    (0.04 secs, 17382284 bytes)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir, usando una red de procesos, la funci\u00f3n\r\n--    factoriales3 :: [Integer]\r\n-- tal que factoriales3 es la lista de los factoriales. Por ejemplo,\r\n--    take 10 factoriales3  ==  [1,1,2,6,24,120,720,5040,40320,362880]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactoriales3 :: [Integer]\r\nfactoriales3 = 1 : aux 1 [1..]\r\n    where aux x (y:ys) = z : aux z ys where z = x*y\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Comparar el tiempo y espacio necesarios para calcular\r\n-- las siguientes expresiones\r\n--    let xs = take 3000 factoriales2 in (sum xs - sum xs)\r\n--    let xs = take 3000 factoriales3 in (sum xs - sum xs)\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> let xs = take 3000 factoriales2 in (sum xs - sum xs)\r\n--    0\r\n--    (0.04 secs, 17382284 bytes)\r\n--    ghci> let xs = take 3000 factoriales3 in (sum xs - sum xs)\r\n--    0\r\n--    (0.04 secs, 18110224 bytes)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Definir, usando scanl1, la funci\u00f3n\r\n--    factoriales4 :: [Integer]\r\n-- tal que factoriales4 es la lista de los factoriales. Por ejemplo,\r\n--    take 10 factoriales4  ==  [1,1,2,6,24,120,720,5040,40320,362880]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactoriales4 :: [Integer]\r\nfactoriales4 = 1 : scanl1 (*) [1..]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Comparar el tiempo y espacio necesarios para calcular\r\n-- las siguientes expresiones\r\n--    let xs = take 3000 factoriales3 in (sum xs - sum xs)\r\n--    let xs = take 3000 factoriales4 in (sum xs - sum xs)\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> let xs = take 3000 factoriales3 in (sum xs - sum xs)\r\n--    0\r\n--    (0.04 secs, 18110224 bytes)\r\n--    ghci> let xs = take 3000 factoriales4 in (sum xs - sum xs)\r\n--    0\r\n--    (0.03 secs, 11965328 bytes)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8. Definir, usando iterate, la funci\u00f3n\r\n--    factoriales5 :: [Integer]\r\n-- tal que factoriales5 es la lista de los factoriales. Por ejemplo,\r\n--    take 10 factoriales5  ==  [1,1,2,6,24,120,720,5040,40320,362880]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactoriales5 :: [Integer]\r\nfactoriales5 = map snd aux\r\n    where aux = iterate f (1,1) where f (x,y) = (x+1,x*y)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9. Comparar el tiempo y espacio necesarios para calcular\r\n-- las siguientes expresiones\r\n--    let xs = take 3000 factoriales4 in (sum xs - sum xs)\r\n--    let xs = take 3000 factoriales5 in (sum xs - sum xs)\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> let xs = take 3000 factoriales4 in (sum xs - sum xs)\r\n--    0\r\n--    (0.04 secs, 18110224 bytes)\r\n--    ghci> let xs = take 3000 factoriales5 in (sum xs - sum xs)\r\n--    0\r\n--    (0.03 secs, 11965760 bytes)\r\n<\/pre>\n<p><b>Destino<\/b><br \/>\nLa anterior relaci\u00f3n de ejercicios la 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","protected":false},"excerpt":{"rendered":"<p>Continuando con la serie sobre evaluaci\u00f3n perezosa en Haskell, otro ejemplo cl\u00e1sico es la lista de los factoriales: 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, &#8230; En la siguiente relaci\u00f3n se proponen distintas definiciones para calcular la lista de factoriales.<\/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":[1],"tags":[],"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\/4041"}],"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=4041"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4041\/revisions"}],"predecessor-version":[{"id":4042,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4041\/revisions\/4042"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=4041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=4041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=4041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}