{"id":2390,"date":"2012-12-04T15:22:52","date_gmt":"2012-12-04T15:22:52","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=2390"},"modified":"2013-03-08T05:47:37","modified_gmt":"2013-03-08T05:47:37","slug":"i1m2012-ejercicios-de-definiciones-por-recursion-y-comprension-en-haskell-3","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-ejercicios-de-definiciones-por-recursion-y-comprension-en-haskell-3\/","title":{"rendered":"I1M2012: Ejercicios de definiciones por recursi\u00f3n y comprensi\u00f3n en Haskell (3)"},"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 14 a 17 de la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2012G2\/images\/6\/6c\/Rel_9.hs\">9\u00aa relaci\u00f3n<\/a> y 1 a 3 de la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2012G2\/images\/6\/6c\/Rel_10.hs\">10\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: Las de la relaci\u00f3n 9 son<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14. (Problema 16 del proyecto Euler) El problema se\r\n-- encuentra en http:\/\/goo.gl\/4uWh y consiste en calcular la suma de los\r\n-- d\u00edgitos de 2^1000. Lo resolveremos mediante los distintos apartados de\r\n-- este ejercicio.  \r\n-- ---------------------------------------------------------------------\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14.1. Definir la funci\u00f3n\r\n--    euler16 :: Integer -> Integer\r\n-- tal que (euler16 n) es la suma de los d\u00edgitos de 2^n. Por ejemplo,\r\n--    euler16 4  ==  7\r\n-- ---------------------------------------------------------------------\r\n\r\neuler16 :: Integer -> Integer\r\neuler16 n = sumaDigitosNR (2^n)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14.2. Calcular la suma de los d\u00edgitos de 2^1000.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El c\u00e1lculo es\r\n--    *Main> euler16 1000\r\n--    1366\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 15. En el enunciado de uno de los problemas de las\r\n-- Olimpiadas matem\u00e1ticas de Brasil se define el primitivo de un n\u00famero\r\n-- como sigue: \r\n--    Dado un n\u00famero natural N, multiplicamos todos sus d\u00edgitos,\r\n--    repetimos este procedimiento hasta que quede un solo d\u00edgito al\r\n--    cual llamamos primitivo de N. Por ejemplo para 327: 3x2x7 = 42 y \r\n--    4x2 = 8. Por lo tanto, el primitivo de 327 es 8.\r\n--\r\n-- Definir la funci\u00f3n \r\n--    primitivo :: Integer -> Integer\r\n-- tal que (primitivo n) es el primitivo de n. Por ejemplo.\r\n--    primitivo 327  ==  8\r\n-- ---------------------------------------------------------------------\r\n\r\nprimitivo :: Integer -> Integer\r\nprimitivo n | n < 10    = n\r\n            | otherwise = primitivo (producto n)\r\n\r\n-- (producto n) es el producto de las cifras de n. Por ejemplo,\r\n--    producto 327  ==  42\r\nproducto :: Integer -> Integer\r\nproducto n = product (digitosC n) \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16. Dos n\u00fameros son equivalentes si la media de sus d\u00edgitos\r\n-- son iguales. Por ejemplo, 3205 y 41 son equivalentes ya que \r\n-- (3+2+0+5)\/4 = (4+1)\/2. Definir la funci\u00f3n \r\n--    equivalentes :: Integer -> Integer -> Bool\r\n-- tal que (equivalentes x y) se verifica si los n\u00fameros x e y son\r\n-- equivalentes. Por ejemplo,\r\n--    equivalentes 3205 41  ==  True\r\n--    equivalentes 3205 25  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\nequivalentes :: Integer -> Integer -> Bool\r\nequivalentes x y = media (digitosC x) == media (digitosC y)\r\n\r\n-- (media xs) es la media de la lista xs. Por ejemplo,\r\n--    media [3,2,0,5]  ==  2.5\r\nmedia :: [Integer] -> Float\r\nmedia xs = (fromIntegral (sum xs)) \/ (fromIntegral (length xs))\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 17. Un n\u00famero x es especial si el n\u00famero de ocurrencia de\r\n-- cada d\u00edgito d de x en x^2 es el doble del n\u00famero de ocurrencia de d\r\n-- en x. Por ejemplo, 72576 es especial porque tiene un 2, un 5, un 6 y\r\n-- dos 7 y su cuadrado es 5267275776 que tiene exactamente dos 2, dos 5,\r\n-- dos 6 y cuatro 7.\r\n-- \r\n-- Definir la funci\u00f3n\r\n--    especial :: Integer -> Bool\r\n-- tal que (especial x) se verifica si x es un n\u00famero especial. Por\r\n-- ejemplo,\r\n--    especial 72576  ==  True\r\n--    especial 12     ==  False\r\n-- Calcular el menor n\u00famero especial mayor que 72576.\r\n-- ---------------------------------------------------------------------\r\n\r\nespecial :: Integer -> Bool\r\nespecial x =\r\n    sort (ys ++ ys) == sort (show (x^2))\r\n    where ys = show x\r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> head [x | x <- [72577..], especial x]\r\n--    406512\r\n<\/pre>\n<p>y los de la relaci\u00f3n 10 son<\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.1. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    cuadradosC :: [Integer] -> [Integer]\r\n-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por\r\n-- ejemplo, \r\n--    cuadradosC [1,2,3]  ==  [1,4,9]\r\n-- ---------------------------------------------------------------------\r\n\r\ncuadradosC :: [Integer] -> [Integer]\r\ncuadradosC xs = [x^2 | x <- xs]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.2. Definir, por recursi\u00f3n, la funci\u00f3n\r\n--    cuadradosR :: [Integer] -> [Integer]\r\n-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por\r\n-- ejemplo, \r\n--    cuadradosR [1,2,3]  ==  [1,4,9]\r\n-- ---------------------------------------------------------------------\r\n\r\ncuadradosR :: [Integer] -> [Integer]\r\ncuadradosR []     = []\r\ncuadradosR (x:xs) = x^2 : cuadradosR xs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2.1. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    imparesC :: [Integer] -> [Integer]\r\n-- tal que (imparesC xs) es la lista de los n\u00fameros impares de xs. Por\r\n-- ejemplo, \r\n--    imparesC [1,2,3]  ==  [1,3]\r\n-- ---------------------------------------------------------------------\r\n\r\nimparesC :: [Integer] -> [Integer]\r\nimparesC xs = [x | x <- xs, odd x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2.2. Definir, por recursi\u00f3n, la funci\u00f3n\r\n--    imparesR :: [Integer] -> [Integer]\r\n-- tal que (imparesR xs) es la lista de los n\u00fameros impares de xs. Por\r\n-- ejemplo, \r\n--    imparesR [1,2,3]  ==  [1,3]\r\n-- ---------------------------------------------------------------------\r\n\r\nimparesR :: [Integer] -> [Integer]\r\nimparesR [] = []\r\nimparesR (x:xs) | odd x     = x : imparesR xs\r\n                | otherwise = imparesR xs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3.1. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    imparesCuadradosC :: [Integer] -> [Integer]\r\n-- tal que (imparesCuadradosC xs) es la lista de los cuadrados de los\r\n-- n\u00fameros impares de xs. Por ejemplo, \r\n--    imparesCuadradosC [1,2,3]  ==  [1,9]\r\n-- ---------------------------------------------------------------------\r\n\r\nimparesCuadradosC :: [Integer] -> [Integer]\r\nimparesCuadradosC xs = [x^2 | x <- xs, odd x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3.2. Definir, por recursi\u00f3n, la funci\u00f3n\r\n--    imparesCuadradosR :: [Integer] -> [Integer]\r\n-- tal que (imparesCuadradosR xs) es la lista de los cuadrados de los\r\n-- n\u00fameros impares de xs. Por ejemplo, \r\n--    imparesCuadradosR [1,2,3]  ==  [1,9]\r\n-- ---------------------------------------------------------------------\r\n\r\nimparesCuadradosR :: [Integer] -> [Integer]\r\nimparesCuadradosR []                 = []\r\nimparesCuadradosR (x:xs) | odd x     = x^2 : imparesCuadradosR xs\r\n                         | otherwise = imparesCuadradosR xs\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 14 a 17 de la 9\u00aa relaci\u00f3n y 1 a 3 de la 10\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&#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\/2390"}],"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=2390"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2390\/revisions"}],"predecessor-version":[{"id":2730,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2390\/revisions\/2730"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=2390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=2390"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=2390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}