{"id":3754,"date":"2013-10-11T17:10:36","date_gmt":"2013-10-11T15:10:36","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3754"},"modified":"2013-10-12T13:11:40","modified_gmt":"2013-10-12T11:11:40","slug":"i1m2013-ejercicios-de-definiciones-por-comprension-1","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2013-ejercicios-de-definiciones-por-comprension-1\/","title":{"rendered":"I1M2013: Ejercicios de definiciones por comprensi\u00f3n (1)"},"content":{"rendered":"<p>En la clase de hoy del curso <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-13\">Inform\u00e1tica (de 1\u00ba de Grado en Matem\u00e1ticas)<\/a> se han comentado las soluciones de los 7 primeros ejercicios de la 4\u00aa relaci\u00f3n sobre definiciones por comprensi\u00f3n.<\/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-- Introducci\u00f3n                                                       --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- En esta relaci\u00f3n se presentan ejercicios con definiciones por\r\n-- comprensi\u00f3n correspondientes al tema 5 cuyas transparencias se \r\n-- encuentran en  \r\n--    http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-13\/temas\/tema-5.pdf\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir, por comprensi\u00f3n, la funci\u00f3n sumaDeCuadrados\r\n-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los\r\n-- primeros n n\u00fameros; es decir, 1^2 + 2^2 + ... + n^2. Por ejemplo,\r\n--    sumaDeCuadrados 3    ==  14\r\n--    sumaDeCuadrados 100  ==  338350\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaDeCuadrados n = sum [x^2 | x <- [1..n]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir por comprensi\u00f3n la funci\u00f3n replica tal que\r\n-- (replica n x) es la lista formada por n copias del elemento x. Por\r\n-- ejemplo,  \r\n--    replica 4 7     ==  [7,7,7,7]\r\n--    replica 3 True  ==  [True, True, True]\r\n-- Nota: La funci\u00f3n replica es equivalente a la predefinida replicate.\r\n-- ---------------------------------------------------------------------\r\n\r\nreplica n x = [x | _ <- [1..n]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3.1. Definir la funci\u00f3n suma tal (suma n) es la suma de los\r\n-- n primeros n\u00fameros. Por ejemplo,\r\n--    suma 3  ==  6\r\n-- ---------------------------------------------------------------------\r\n\r\nsuma n = sum [1..n]\r\n\r\n-- Otra definici\u00f3n m\u00e1s eficiente es\r\nsuma2 n = (1+n)*n `div` 2\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3.2. Los tri\u00e1ngulo aritm\u00e9tico se forman como sigue\r\n--     1\r\n--     2  3\r\n--     4  5  6\r\n--     7  8  9 10\r\n--    11 12 13 14 15\r\n--    16 16 18 19 20 21\r\n-- Definir la funci\u00f3n linea tal que (linea n) es la l\u00ednea n-\u00e9sima de los\r\n-- tri\u00e1ngulos aritm\u00e9ticos. Por ejemplo, \r\n--    linea 4  ==  [7,8,9,10]\r\n--    linea 5  ==  [11,12,13,14,15]\r\n-- ---------------------------------------------------------------------\r\n\r\nlinea n = [suma (n-1)+1..suma n]\r\n\r\n-- La definici\u00f3n puede mejorarse\r\nlinea2 n = [s+1..s+n]\r\n           where s = suma (n-1)\r\n\r\n-- Una variante m\u00e1s eficiente es \r\nlinea3 n = [s+1..s+n]\r\n           where s = suma2 (n-1)\r\n\r\n-- La mejora de la eficiencia se puede observar como sigue:\r\n--    ghci> :set +s\r\n--    ghci> head (linea 1000000)\r\n--    499999500001\r\n--    (17.94 secs, 309207420 bytes)\r\n--    ghci> head (linea3 1000000)\r\n--    499999500001\r\n--    (0.01 secs, 525496 bytes)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3.3. Definir la funci\u00f3n triangulo tal que (triangulo n) es\r\n-- el tri\u00e1ngulo aritm\u00e9tico de altura n. Por ejemplo,\r\n--    triangulo 3  ==  [[1],[2,3],[4,5,6]]\r\n--    triangulo 4  ==  [[1],[2,3],[4,5,6],[7,8,9,10]]\r\n-- ---------------------------------------------------------------------\r\n\r\ntriangulo n = [linea m | m <- [1..n]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Un entero positivo es perfecto si es igual a la suma de\r\n-- sus factores, excluyendo el propio n\u00famero. \r\n-- \r\n-- Definir por comprensi\u00f3n la funci\u00f3n perfectos tal que (perfectos n) es\r\n-- la lista de todos los n\u00fameros perfectos menores que n. Por ejemplo, \r\n--    perfectos 500  ==  [6,28,496]\r\n-- Indicaci\u00f3n: Usar la funci\u00f3n factores del tema 5.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La funci\u00f3n factores del tema es\r\nfactores n = [x | x <- [1..n], n `mod` x == 0]\r\n\r\n-- La definici\u00f3n es\r\nperfectos n = [x | x <- [1..n], sum (init (factores x)) == x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5.1. Un n\u00famero natural n se denomina abundante si es menor\r\n-- que la suma de sus divisores propios. Por ejemplo, 12 y 30 son\r\n-- abundantes pero 5 y 28 no lo son.\r\n-- \r\n-- Definir la funci\u00f3n numeroAbundante tal que (numeroAbundante n) se\r\n-- verifica si n es un n\u00famero abundante. Por ejemplo, \r\n--    numeroAbundante 5  == False\r\n--    numeroAbundante 12 == True\r\n--    numeroAbundante 28 == False\r\n--    numeroAbundante 30 == True\r\n-- ---------------------------------------------------------------------\r\n\r\ndivisores n = [m | m <- [1..n-1], n `mod` m == 0]\r\n\r\nnumeroAbundante n = n < sum (divisores n)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5.2. Definir la funci\u00f3n numerosAbundantesMenores tal que\r\n-- (numerosAbundantesMenores n) es la lista de n\u00fameros abundantes\r\n-- menores o iguales que n. Por ejemplo,\r\n--    numerosAbundantesMenores 50  ==  [12,18,20,24,30,36,40,42,48]\r\n-- ---------------------------------------------------------------------\r\n\r\nnumerosAbundantesMenores n = [x | x <- [1..n], numeroAbundante x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5.3. Definir la funci\u00f3n todosPares tal que (todosPares n)\r\n-- se verifica si todos los n\u00fameros abundantes menores o iguales que n\r\n-- son pares. Por ejemplo,\r\n--    todosPares 10    ==  True\r\n--    todosPares 100   ==  True\r\n--    todosPares 1000  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\ntodosPares n = and [even x | x <- numerosAbundantesMenores n]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5.4. Definir la constante primerAbundanteImpar que calcule\r\n-- el primer n\u00famero natural abundante impar. Determinar el valor de\r\n-- dicho n\u00famero.\r\n-- ---------------------------------------------------------------------\r\n\r\nprimerAbundanteImpar = head [x | x <-[1..], numeroAbundante x, odd x]\r\n\r\n-- Su c\u00e1lculo es\r\n--    ghci> primerAbundanteImpar\r\n--    945\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6 (Problema 1 del proyecto Euler) Definir la funci\u00f3n euler1 \r\n-- tal que (euler1 n) es la suma de todos los m\u00faltiplos de 3 \u00f3 5 menores\r\n-- que n. Por ejemplo,\r\n--    euler1 10  ==  23\r\n-- \r\n-- Calcular la suma de todos los m\u00faltiplos de 3 \u00f3 5 menores que 1000.\r\n-- ---------------------------------------------------------------------\r\n\r\neuler1 n = sum [x | x <- [1..n-1], multiplo x 3 || multiplo x 5]\r\n    where multiplo x y = mod x y == 0\r\n\r\n-- C\u00e1lculo:\r\n--    ghci> euler1 1000\r\n--    233168\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Definir la funci\u00f3n circulo tal que (circulo n) es el la\r\n-- cantidad de pares de n\u00fameros naturales (x,y) que se encuentran dentro\r\n-- del c\u00edrculo de radio n. Por ejemplo, \r\n--    circulo 3  ==  9\r\n--    circulo 4  ==  15\r\n--    circulo 5  ==  22\r\n-- ---------------------------------------------------------------------\r\n\r\ncirculo n = length [(x,y) | x <- [0..n], y <- [0..n], x^2+y^2 < n^2]\r\n\r\n-- La eficiencia puede mejorarse con\r\ncirculo2 n = length [(x,y) | x <- [0..m], y <- [0..m], x^2+y^2 < n^2]\r\n    where m = raizCuadradaEntera n\r\n\r\n-- (raizCuadradaEntera n) es la parte entera de la ra\u00edz cuadrada de\r\n-- n. Por ejemplo,\r\n--    raizCuadradaEntera 17  ==  4 \r\nraizCuadradaEntera :: Int -> Int\r\nraizCuadradaEntera n = truncate (sqrt (fromIntegral n))\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy del curso Inform\u00e1tica (de 1\u00ba de Grado en Matem\u00e1ticas) se han comentado las soluciones de los 7 primeros ejercicios de la 4\u00aa relaci\u00f3n sobre definiciones por comprensi\u00f3n. Los ejercicios y sus soluciones se muestran a continuaci\u00f3n<\/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":[222],"tags":[270,300],"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\/3754"}],"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=3754"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3754\/revisions"}],"predecessor-version":[{"id":3755,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3754\/revisions\/3755"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3754"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3754"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}