{"id":1658,"date":"2011-11-02T19:48:07","date_gmt":"2011-11-02T19:48:07","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2011-ejercicios-de-definiciones-por-comprension-en-haskell-2\/"},"modified":"2013-03-08T05:49:01","modified_gmt":"2013-03-08T05:49:01","slug":"i1m2011-ejercicios-de-definiciones-por-comprension-en-haskell-2","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2011-ejercicios-de-definiciones-por-comprension-en-haskell-2\/","title":{"rendered":"I1M2011: Ejercicios de definiciones por comprensi\u00f3n en Haskell (2)"},"content":{"rendered":"<p>En la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-11\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos comentado las soluciones a los 5 primeros ejercicios de la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2011G1\/images\/0\/0a\/Rel_4.hs\">4\u00aa relaci\u00f3n<\/a> que tratan 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-- I1M 2011-12: Rel_4_sol.hs\r\n-- Definiciones por comprensi\u00f3n (2)\r\n-- Departamento de Ciencias de la Computaci\u00f3n e I.A.\r\n-- Universidad de Sevilla\r\n-- =====================================================================\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Introducci\u00f3n                                                       --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- En esta relaci\u00f3n se presentan m\u00e1s 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-11\/temas\/tema-5.pdf\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.1. Definir la funci\u00f3n aproxE tal que (aproXE n) es la\r\n-- lista cuyos elementos son los t\u00e9rminos de la sucesi\u00f3n (1+1\/m)**m\r\n-- desde 1 hasta n. Por ejemplo, \r\n--    aproxE 1 == [2.0]\r\n--    aproxE 4 == [2.0,2.25,2.37037037037037,2.44140625]\r\n-- ---------------------------------------------------------------------\r\n\r\naproxE n = [(1+1\/m)**m | m <- [1..n]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.2. \u00bfCu\u00e1l es el l\u00edmite de la sucesi\u00f3n (1+1\/m)**m ?\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El l\u00edmite de la sucesi\u00f3n es el n\u00famero e. \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.3. Definir la funci\u00f3n errorE tal que (errorE x) es el\r\n-- menor n\u00famero de t\u00e9rminos de la sucesi\u00f3n (1+1\/m)**m necesarios para\r\n-- obtener su l\u00edmite con un error menor que x. Por ejemplo,\r\n--    errorAproxE 0.1    ==  13.0\r\n--    errorAproxE 0.01   ==  135.0\r\n--    errorAproxE 0.001  ==  1359.0\r\n-- Indicaci\u00f3n: En Haskell, e se calcula como (exp 1).\r\n-- ---------------------------------------------------------------------\r\n\r\nerrorAproxE x = head [m | m <- [1..], abs((exp 1) - (1+1\/m)**m) < x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2.1. Definir la funci\u00f3n aproxLimSeno tal que \r\n-- (aproxLimSeno n) es la lista cuyos elementos son los t\u00e9rminos de la\r\n-- sucesi\u00f3n  \r\n--    sen(1\/m) \r\n--    --------\r\n--      1\/m \r\n-- desde 1 hasta n. Por ejemplo,\r\n--    aproxLimSeno 1 == [0.8414709848078965]\r\n--    aproxLimSeno 2 == [0.8414709848078965,0.958851077208406]\r\n-- ---------------------------------------------------------------------\r\n\r\naproxLimSeno n = [sin(1\/m)\/(1\/m) | m <- [1..n]] \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2.2. \u00bfCu\u00e1l es el l\u00edmite de la sucesi\u00f3n sen(1\/m)\/(1\/m) ?\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El l\u00edmite es 1.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2.3. Definir la funci\u00f3n errorLimSeno tal que \r\n-- (errorLimSeno x) es el menor n\u00famero de t\u00e9rminos de la sucesi\u00f3n \r\n-- sen(1\/m)\/(1\/m) necesarios para obtener su l\u00edmite con un error menor\r\n-- que x. Por ejemplo, \r\n--    errorLimSeno 0.1     ==   2.0\r\n--    errorLimSeno 0.01    ==   5.0\r\n--    errorLimSeno 0.001   ==  13.0\r\n--    errorLimSeno 0.0001  ==  41.0\r\n-- ---------------------------------------------------------------------\r\n\r\nerrorLimSeno x = head [m | m <- [1..], abs(1 - sin(1\/m)\/(1\/m)) < x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3.1. Definir la funci\u00f3n calculaPi tal que (calculaPi n) es\r\n-- la aproximaci\u00f3n del n\u00famero pi calculada mediante la expresi\u00f3n\r\n--    4*(1 - 1\/3 + 1\/5 - 1\/7 + ...+ (-1)**n\/(2*n+1))\r\n-- Por ejemplo,\r\n--    calculaPi 3    ==  2.8952380952380956\r\n--    calculaPi 300  ==  3.1449149035588526\r\n-- ---------------------------------------------------------------------\r\n\r\ncalculaPi n = 4 * sum [(-1)**x\/(2*x+1) | x <- [0..n]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3.2. Definir la funci\u00f3n errorPi tal que \r\n-- (errorPi x) es el menor n\u00famero de t\u00e9rminos de la serie\r\n--    4*(1 - 1\/3 + 1\/5 - 1\/7 + ...+ (-1)**n\/(2*n+1))\r\n-- necesarios para obtener pi con un error menor que x. Por ejemplo,\r\n--    errorPi 0.1    ==   9.0\r\n--    errorPi 0.01   ==  99.0\r\n--    errorPi 0.001  ==  999.0\r\n-- ---------------------------------------------------------------------\r\n\r\nerrorPi x = head [n | n <- [1..], abs (pi - (calculaPi n)) < x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.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 es\r\nsuma' n = (1+n)*n `div` 2\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.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-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.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 5. La bases de datos sobre actividades de personas pueden\r\n-- representarse mediante listas de elementos de la forma (a,b,c,d),\r\n-- donde a es el nombre de la persona, b su actividad, c su fecha de\r\n-- nacimiento y d la de su fallecimiento. Un ejemplo es la siguiente que\r\n-- usaremos a lo largo de este ejercicio,\r\n-- ---------------------------------------------------------------------\r\n\r\npersonas :: [(String,String,Int,Int)]\r\npersonas = [(\"Cervantes\",\"Literatura\",1547,1616),\r\n              (\"Velazquez\",\"Pintura\",1599,1660),\r\n              (\"Picasso\",\"Pintura\",1881,1973),\r\n              (\"Beethoven\",\"Musica\",1770,1823),\r\n              (\"Poincare\",\"Ciencia\",1854,1912),\r\n              (\"Quevedo\",\"Literatura\",1580,1654),\r\n              (\"Goya\",\"Pintura\",1746,1828),\r\n              (\"Einstein\",\"Ciencia\",1879,1955),\r\n              (\"Mozart\",\"Musica\",1756,1791),\r\n              (\"Botticelli\",\"Pintura\",1445,1510),\r\n              (\"Borromini\",\"Arquitectura\",1599,1667),\r\n              (\"Bach\",\"Musica\",1685,1750)]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5.1. Definir la funci\u00f3n nombres tal que (nombres bd) es\r\n-- la lista de los nombres de las personas de la base de datos bd. Por\r\n-- ejemplo,  \r\n--    ghci> nombres personas\r\n--     [\"Cervantes\",\"Velazquez\",\"Picasso\",\"Beethoven\",\"Poincare\",\r\n--      \"Quevedo\",\"Goya\",\"Einstein\",\"Mozart\",\"Botticelli\",\"Borromini\",\"Bach\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nnombres :: [(String,String,Int,Int)] -> [String]\r\nnombres bd = [x | (x,_,_,_) <- bd]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5.2. Definir la funci\u00f3n musicos tal que (musicos bd) es\r\n-- la lista de los nombres de los m\u00fasicos de la base de datos bd. Por\r\n-- ejemplo,  \r\n--    ghci> musicos personas\r\n--    [\"Beethoven\",\"Mozart\",\"Bach\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nmusicos :: [(String,String,Int,Int)] -> [String]\r\nmusicos bd = [x | (x,m,_,_) <- bd, m == \"Musica\"]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5.3. Definir la funci\u00f3n seleccion tal que (seleccion bd m) \r\n-- es la lista de los nombres de las personas de la base de datos bd\r\n-- cuya actividad es m. Por ejemplo,  \r\n--    ghci> seleccion personas \"Pintura\"\r\n--    [\"Velazquez\",\"Picasso\",\"Goya\",\"Botticelli\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nseleccion :: [(String,String,Int,Int)] -> String -> [String]\r\nseleccion bd m = [ x | (x,m',_,_) <- bd, m == m' ]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5.4. Definir, usando el apartado anterior, la funci\u00f3n\r\n-- musicos' tal que (musicos' bd) es la lista de los nombres de los\r\n-- m\u00fasicos de la base de datos bd. Por ejemplo,  \r\n--    ghci> musicos' personas\r\n--    [\"Beethoven\",\"Mozart\",\"Bach\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nmusicos' :: [(String,String,Int,Int)] -> [String]\r\nmusicos' bd = seleccion bd \"Musica\"\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5.5. Definir la funci\u00f3n vivas tal que (vivas bd a) es la\r\n-- lista de los nombres de las personas de la base de datos bd  que\r\n-- estaban vivas en el a\u00f1o a. Por ejemplo,  \r\n--    ghci> vivas personas 1600\r\n--    [\"Cervantes\",\"Velazquez\",\"Quevedo\",\"Borromini\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nvivas :: [(String,String,Int,Int)] -> Int -> [String]\r\nvivas ps a = [x | (x,_,a1,a2) <- ps, a1 <= a, a <= a2]\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 a los 5 primeros ejercicios de la 4\u00aa relaci\u00f3n que tratan 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":"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":[186],"tags":[295],"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\/1658"}],"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=1658"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1658\/revisions"}],"predecessor-version":[{"id":2923,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1658\/revisions\/2923"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=1658"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=1658"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=1658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}