{"id":2408,"date":"2012-12-13T19:18:54","date_gmt":"2012-12-13T19:18:54","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-ejercicios-de-definiciones-por-recursion-y-comprension-en-haskell-5\/"},"modified":"2013-03-08T05:47:36","modified_gmt":"2013-03-08T05:47:36","slug":"i1m2012-ejercicios-de-definiciones-por-recursion-y-comprension-en-haskell-5","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-ejercicios-de-definiciones-por-recursion-y-comprension-en-haskell-5\/","title":{"rendered":"I1M2012: Ejercicios de definiciones por recursi\u00f3n y comprensi\u00f3n en Haskell (5)"},"content":{"rendered":"<p>En la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-12\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos comentado las soluciones de los ejercicios 6 a 8 de la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2012G2\/images\/6\/6c\/Rel_11.hs\">11\u00aa relaci\u00f3n<\/a> en las que se presentan ejercicios con dos definiciones (una por recursi\u00f3n y otra por comprensi\u00f3n) y la comprobaci\u00f3n de la equivalencia de las dos definiciones con QuickCheck. <\/p>\n<p>Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n:<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Importaci\u00f3n de librer\u00edas auxiliares                                --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Test.QuickCheck\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.1. Una persona es tan agarrada que s\u00f3lo compra cuando le\r\n-- hacen un descuento del 10% y el precio (con el descuento) es menor o\r\n-- igual que 199. \r\n-- \r\n-- Definir, usando comprensi\u00f3n, la funci\u00f3n\r\n--    agarradoC :: [Float] -> Float\r\n-- tal que (agarradoC ps) es el precio que tiene que pagar por una compra\r\n-- cuya lista de precios es ps. Por ejemplo,\r\n--    agarradoC [45.00, 199.00, 220.00, 399.00]  ==  417.59998\r\n-- ---------------------------------------------------------------------\r\n\r\nagarradoC :: [Float] -> Float\r\nagarradoC ps = sum [p * 0.9 | p <- ps, p * 0.9 <= 199]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.2. Definir, por recursi\u00f3n, la funci\u00f3n\r\n--    agarradoR :: [Float] -> Float\r\n-- tal que (agarradoR ps) es el precio que tiene que pagar por una compra\r\n-- cuya lista de precios es ps. Por ejemplo,\r\n--    agarradoR  [45.00, 199.00, 220.00, 399.00]  ==  417.59998\r\n-- ---------------------------------------------------------------------\r\n\r\nagarradoR :: [Float] -> Float\r\nagarradoR [] = 0\r\nagarradoR (p:ps)\r\n    | precioConDescuento <= 199 = precioConDescuento + agarradoR ps\r\n    | otherwise                 = agarradoR ps\r\n    where precioConDescuento = p * 0.9 \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.3. Comprobar con QuickCheck que ambas definiciones son\r\n-- similares; es decir, el valor absoluto de su diferencia es menor que\r\n-- una d\u00e9cima. \r\n-- ---------------------------------------------------------------------\r\n\r\n-- La propiedad es\r\nprop_agarrado :: [Float] -> Bool\r\nprop_agarrado xs = abs (agarradoR xs - agarradoC xs) <= 0.1\r\n\r\n-- La comprobaci\u00f3n es\r\n--    *Main> quickCheck prop_agarrado\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7.1. Definir la funci\u00f3n\r\n--    factores :: Integer -> Integer\r\n-- tal que (factores n) es la lista de los factores de n. Por ejemplo, \r\n--    factores 60  ==  [1,2,3,4,5,6,10,12,15,20,30,60]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactores :: Integer -> [Integer]\r\nfactores n = [x | x <- [1..n], rem n x == 0]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7.2. Definir la funci\u00f3n\r\n--    primo :: Integer -> Bool\r\n-- tal que (primo n) se verifica si n es primo. Por ejemplo,\r\n--    primo 7  ==  True\r\n--    primo 9  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\nprimo :: Integer -> Bool\r\nprimo x = factores x == [1,x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7.3. Definir la funci\u00f3n\r\n--    factoresPrimos :: Integer -> [Integer]\r\n-- tal que (factoresPrimos n) es la lista de los factores primos de\r\n-- n. Por ejemplo,  \r\n--    factoresPrimos 60  ==  [2,3,5]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactoresPrimos :: Integer -> [Integer]\r\nfactoresPrimos n = [x | x <- factores n, primo x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.1. Definir, por recursi\u00f3n, la funci\u00f3n \r\n--    mayorExponenteR :: Integer -> Integer -> Integer \r\n-- tal que (mayorExponenteR a b) es el exponente de la mayor potencia de\r\n-- a que divide b. Por ejemplo,\r\n--    mayorExponenteR 2 8    ==  3\r\n--    mayorExponenteR 2 9    ==  0\r\n--    mayorExponenteR 5 100  ==  2\r\n--    mayorExponenteR 2 60   ==  2\r\n-- ---------------------------------------------------------------------\r\n\r\nmayorExponenteR :: Integer -> Integer -> Integer \r\nmayorExponenteR a b\r\n    | rem b a \/= 0 = 0\r\n    | otherwise    = 1 + mayorExponenteR a (b `div` a)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.2. Definir, por recursi\u00f3n, la funci\u00f3n \r\n--    mayorExponenteC :: Integer -> Integer -> Integer \r\n-- tal que (mayorExponenteC a b) es el exponente de la mayor potencia de\r\n-- a que divide a b. Por ejemplo,\r\n--    mayorExponenteC 2 8    ==  3\r\n--    mayorExponenteC 5 100  ==  2\r\n--    mayorExponenteC 5 101  ==  0\r\n-- ---------------------------------------------------------------------\r\n\r\nmayorExponenteC :: Integer -> Integer -> Integer\r\nmayorExponenteC a b = head [x-1 | x <- [0..], mod b (a^x) \/= 0]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.3. Definir la funci\u00f3n\r\n--    factorizacion :: Integer -> [(Integer,Integer)]\r\n-- tal que (factorizacion n) es la factorizaci\u00f3n de n. Por ejemplo,  \r\n--    factorizacion 60  ==  [(2,2),(3,1),(5,1)]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactorizacion :: Integer -> [(Integer,Integer)]\r\nfactorizacion n = [(x,mayorExponenteR x n) | x <- factoresPrimos n]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.4. Definir, por recursi\u00f3n, la funci\u00f3n\r\n--    expansionR :: [(Integer,Integer)] -> Integer\r\n-- tal que (expansionR xs) es la expansi\u00f3n de la factorizaci\u00f3n de\r\n-- xs. Por ejemplo,   \r\n--    expansionR [(2,2),(3,1),(5,1)]  ==  60\r\n-- ---------------------------------------------------------------------\r\n\r\nexpansionR :: [(Integer,Integer)] -> Integer\r\nexpansionR [] = 1\r\nexpansionR ((x,y):zs) = x^y * expansionR zs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.5. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    expansionC :: [(Integer,Integer)] -> Integer\r\n-- tal que (expansionC xs) es la expansi\u00f3n de la factorizaci\u00f3n de\r\n-- xs. Por ejemplo,   \r\n--    expansionC [(2,2),(3,1),(5,1)]  ==  60\r\n-- ---------------------------------------------------------------------\r\n\r\nexpansionC :: [(Integer,Integer)] -> Integer\r\nexpansionC xs = product [x^y | (x,y) <- xs]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.6. Definir la funci\u00f3n\r\n--    prop_factorizacion :: Integer -> Bool\r\n-- tal que (prop_factorizacion n) se verifica si para todo n\u00famero\r\n-- natural x, menor o igual que n, se tiene que \r\n-- (expansionC (factorizacion x)) es igual a x. Por ejemplo,\r\n--    prop_factorizacion 100  ==  True\r\n-- ---------------------------------------------------------------------\r\n\r\nprop_factorizacion n =\r\n    and [expansionC (factorizacion x) == x | x <- [1..n]]\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas hemos comentado las soluciones de los ejercicios 6 a 8 de la 11\u00aa relaci\u00f3n en las que se presentan ejercicios con dos definiciones (una por recursi\u00f3n y otra por comprensi\u00f3n) y la comprobaci\u00f3n de la equivalencia de las dos definiciones con QuickCheck&#8230;.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","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":[298],"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\/2408"}],"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=2408"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2408\/revisions"}],"predecessor-version":[{"id":2723,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2408\/revisions\/2723"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=2408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=2408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=2408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}