{"id":2413,"date":"2012-12-17T16:38:26","date_gmt":"2012-12-17T16:38:26","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=2413"},"modified":"2013-03-08T05:47:36","modified_gmt":"2013-03-08T05:47:36","slug":"i1m2012-ejercicios-de-definiciones-por-recursion-y-comprension-en-haskell-6","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-ejercicios-de-definiciones-por-recursion-y-comprension-en-haskell-6\/","title":{"rendered":"I1M2012: Ejercicios de definiciones por recursi\u00f3n y comprensi\u00f3n en Haskell (6)"},"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 9 a 12 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 9.1. [Problema 357 del Project Euler] Un n\u00famero natural n\r\n-- es especial si para todo divisor d de n, d+n\/d es primo. Definir la\r\n-- funci\u00f3n  \r\n--    especial :: Integer -> Bool\r\n-- tal que (especial x) se verifica si x es especial. Por ejemplo,\r\n--    especial 30  ==  True\r\n--    especial 20  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\nespecial :: Integer -> Bool\r\nespecial x = and [primo (d + x `div` d) | d <- factores x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9.2. Definir la funci\u00f3n \r\n--    sumaEspeciales :: Integer -> Integer\r\n-- tal que (sumaEspeciales n) es la suma de los n\u00fameros especiales\r\n-- menores o iguales que n. Por ejemplo, \r\n--    sumaEspeciales 100  ==  401\r\n-- ---------------------------------------------------------------------\r\n\r\n-- Por comprensi\u00f3n\r\nsumaEspeciales :: Integer -> Integer\r\nsumaEspeciales n = sum [x | x <- [1..n], especial x]\r\n\r\n-- Por recursi\u00f3n\r\nsumaEspecialesR :: Integer -> Integer\r\nsumaEspecialesR 0 = 0\r\nsumaEspecialesR n | especial n = n + sumaEspecialesR (n-1)\r\n                  | otherwise  = sumaEspecialesR (n-1)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10.1.  La distancia de Hamming entre dos listas es el n\u00famero\r\n-- de posiciones en que los correspondientes elementos son\r\n-- distintos. Por ejemplo, la distancia de Hamming entre \"roma\" y \"loba\" \r\n-- es 2 (porque hay 2 posiciones en las que los elementos\r\n-- correspondientes son distintos: la 1\u00aa y la 3\u00aa). \r\n--    \r\n-- Definir por comprensi\u00f3n la funci\u00f3n\r\n--    distancia :: Eq a => [a] -> [a] -> Int\r\n-- tal que (distanciaC xs ys) es la distancia de Hamming entre xs e\r\n-- ys. Por ejemplo,\r\n--    distanciaC \"romano\" \"comino\"  ==  2\r\n--    distanciaC \"romano\" \"camino\"  ==  3\r\n--    distanciaC \"roma\"   \"comino\"  ==  2\r\n--    distanciaC \"roma\"   \"camino\"  ==  3\r\n--    distanciaC \"romano\" \"ron\"     ==  1\r\n--    distanciaC \"romano\" \"cama\"    ==  2\r\n--    distanciaC \"romano\" \"rama\"    ==  1\r\n-- ---------------------------------------------------------------------\r\n\r\ndistanciaC :: Eq a => [a] -> [a] -> Int\r\ndistanciaC xs ys = sum [1 | (x,y) <- zip xs ys, x \/= y] \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10.2. Definir por recursi\u00f3n la funci\u00f3n\r\n--    distanciaR :: Eq a => [a] -> [a] -> Int\r\n-- tal que (distanciaR xs ys) es la distancia de Hamming entre xs e\r\n-- ys. Por ejemplo,\r\n--    distanciaR \"romano\" \"comino\"  ==  2\r\n--    distanciaR \"romano\" \"camino\"  ==  3\r\n--    distanciaR \"roma\"   \"comino\"  ==  2\r\n--    distanciaR \"roma\"   \"camino\"  ==  3\r\n--    distanciaR \"romano\" \"ron\"     ==  1\r\n--    distanciaR \"romano\" \"cama\"    ==  2\r\n--    distanciaR \"romano\" \"rama\"    ==  1\r\n-- ---------------------------------------------------------------------\r\n\r\ndistanciaR :: Eq a => [a] -> [a] -> Int\r\ndistanciaR [] ys = 0\r\ndistanciaR xs [] = 0\r\ndistanciaR (x:xs) (y:ys) | x \/= y    = 1 + distanciaR xs ys\r\n                         | otherwise = distanciaR xs ys\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 11. Definir la funci\u00f3n\r\n--    traspuesta :: [[a]] -> [[a]]\r\n-- tal que (traspuesta m) es la traspuesta de la matriz m. Por ejemplo,\r\n--    traspuesta [[1,2,3],[4,5,6]]    ==  [[1,4],[2,5],[3,6]]\r\n--    traspuesta [[1,4],[2,5],[3,6]]  ==  [[1,2,3],[4,5,6]]\r\n-- ---------------------------------------------------------------------\r\n\r\ntraspuesta :: [[a]] -> [[a]]\r\ntraspuesta ([]:_) = []\r\ntraspuesta xss = \r\n    primeros xss : traspuesta (restos xss)\r\n\r\n-- (primeros xss) es la lista de los primeros elementos de xss. Por\r\n-- ejemplo, \r\n--    primeros [[1,2,3],[4,5,6]]    ==  [1,4]\r\n--    primeros [[1,4],[2,5],[3,6]]  ==  [1,2,3]\r\nprimeros xss = [head xs | xs <- xss] \r\n\r\n-- (restos xss) es la lista de los restos de xss. Por ejemplo, \r\n--    restos [[1,2,3],[4,5,6]]    ==  [[2,3],[5,6]]\r\n--    restos [[1,4],[2,5],[3,6]]  ==  [[4],[5],[6]]\r\nrestos xss   = [tail xs | xs <- xss]   \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 12. [2.5 puntos] Definir la funci\u00f3n\r\n--    sumas :: Int -> [Int] -> [Int]\r\n-- tal que (sumas n xs) es la lista de los n\u00fameros que se pueden obtener\r\n-- como suma de n, o menos, elementos de xs. Por ejemplo,\r\n--    sumas 0 [2,5]    ==  [0]\r\n--    sumas 1 [2,5]    ==  [2,5,0]\r\n--    sumas 2 [2,5]    ==  [4,7,2,10,5,0]\r\n--    sumas 3 [2,5]    ==  [6,9,4,12,7,2,15,10,5,0]\r\n--    sumas 2 [2,3,5]  ==  [4,5,7,2,6,8,3,10,5,0]\r\n-- ---------------------------------------------------------------------\r\n\r\nsumas :: Int -> [Int] -> [Int]\r\nsumas 0 _  = [0]\r\nsumas _ [] = [0]  \r\nsumas n (x:xs) = [x+y | y <- sumas (n-1) (x:xs)] ++ sumas n 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 9 a 12 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\/2413"}],"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=2413"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2413\/revisions"}],"predecessor-version":[{"id":2721,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2413\/revisions\/2721"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=2413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=2413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=2413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}