{"id":5783,"date":"2017-10-18T19:03:45","date_gmt":"2017-10-18T17:03:45","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=5783"},"modified":"2017-10-20T16:37:54","modified_gmt":"2017-10-20T14:37:54","slug":"i1m2017-ejercicios-de-definiciones-por-comprension","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2017-ejercicios-de-definiciones-por-comprension\/","title":{"rendered":"I1M2017: Ejercicios de definiciones por comprensi\u00f3n (1)"},"content":{"rendered":"<p>En la clase de hoy del curso de<br \/>\n<a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-16\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a><br \/>\nse han comentado soluciones de los tres primeros ejercicios de la 3\u00aa relaci\u00f3n sobre definiciones por comprensi\u00f3n.<\/p>\n<p>Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\n-- I1M 2017-18: Rel_4.hs (6 de Octubre de 2017)\n-- Definiciones por comprensi\u00f3n\n-- Departamento de Ciencias de la Computaci\u00f3n e I.A.\n-- Universidad de Sevilla\n-- =====================================================================\n\nmodule Rel_3_sol where\n\n-- ---------------------------------------------------------------------\n-- Introducci\u00f3n                                                       --\n-- ---------------------------------------------------------------------\n\n-- En esta relaci\u00f3n se presentan ejercicios con definiciones por\n-- comprensi\u00f3n correspondientes al tema 5 que se encuentra\n--    http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-17\/temas\/tema-5.html\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 1. Definir, por comprensi\u00f3n, la funci\u00f3n \n--    sumaDeCuadrados :: Integer -> Integer \n-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los\n-- primeros n n\u00fameros; es decir, 1^2 + 2^2 + ... + n^2. Por ejemplo,\n--    sumaDeCuadrados 3    ==  14\n--    sumaDeCuadrados 100  ==  338350\n-- ---------------------------------------------------------------------\n\nsumaDeCuadrados :: Integer -> Integer \nsumaDeCuadrados n = sum [x^2 | x <- [1..n]]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2. Definir por comprensi\u00f3n la funci\u00f3n \n--    replica :: Int -> a -> [a]\n-- tal que (replica n x) es la lista formada por n copias del elemento\n-- x. Por ejemplo,  \n--    replica 4 7     ==  [7,7,7,7]\n--    replica 3 True  ==  [True, True, True]\n-- Nota: La funci\u00f3n replica es equivalente a la predefinida replicate.\n-- ---------------------------------------------------------------------\n\nreplica :: Int -> a -> [a]\nreplica n x = [x | _ <- [1..n]]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3.1. Definir la funci\u00f3n \n--    suma :: Integer -> Integer\n-- tal (suma n) es la suma de los n primeros n\u00fameros. Por ejemplo,\n--    suma 3  ==  6\n-- ---------------------------------------------------------------------\n\nsuma :: Integer -> Integer\nsuma n = sum [1..n]\n\n-- Otra definici\u00f3n m\u00e1s eficiente es\nsuma2 :: Integer -> Integer\nsuma2 n = (1+n)*n `div` 2\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3.2. Los tri\u00e1ngulos aritm\u00e9ticos se forman como sigue\n--     1\n--     2  3\n--     4  5  6\n--     7  8  9 10\n--    11 12 13 14 15\n--    16 17 18 19 20 21\n-- Definir la funci\u00f3n\n--    linea :: Integer -> [Integer]\n-- tal que (linea n) es la l\u00ednea n-\u00e9sima de los tri\u00e1ngulos\n-- aritm\u00e9ticos. Por ejemplo,  \n--    linea 4  ==  [7,8,9,10]\n--    linea 5  ==  [11,12,13,14,15]\n-- ---------------------------------------------------------------------\n\nlinea :: Integer -> [Integer]\nlinea n = [suma (n-1)+1..suma n]\n\n-- La definici\u00f3n puede mejorarse\nlinea2 :: Integer -> [Integer]\nlinea2 n = [s+1..s+n]\n  where s = suma (n-1)\n\n-- Una variante m\u00e1s eficiente es \nlinea3 :: Integer -> [Integer]\nlinea3 n = [s+1..s+n]\n  where s = suma2 (n-1)\n\n-- La mejora de la eficiencia se puede observar como sigue:\n--    ghci> :set +s\n--    ghci> head (linea 1000000)\n--    499999500001\n--    (17.94 secs, 309207420 bytes)\n--    ghci> head (linea3 1000000)\n--    499999500001\n--    (0.01 secs, 525496 bytes)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3.3. Definir la funci\u00f3n \n--    triangulo :: Integer -> [[Integer]]\n-- tal que (triangulo n) es el tri\u00e1ngulo aritm\u00e9tico de altura n. Por\n-- ejemplo, \n--    triangulo 3  ==  [[1],[2,3],[4,5,6]]\n--    triangulo 4  ==  [[1],[2,3],[4,5,6],[7,8,9,10]]\n-- ---------------------------------------------------------------------\n\ntriangulo :: Integer -> [[Integer]]\ntriangulo n = [linea m | m <- [1..n]]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy del curso de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se han comentado soluciones de los tres primeros ejercicios de la 3\u00aa relaci\u00f3n sobre definiciones por comprensi\u00f3n. Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<\/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":[265],"tags":[270,316],"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\/5783"}],"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=5783"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5783\/revisions"}],"predecessor-version":[{"id":5796,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5783\/revisions\/5796"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=5783"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=5783"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=5783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}