{"id":6282,"date":"2018-10-24T13:04:54","date_gmt":"2018-10-24T11:04:54","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=6282"},"modified":"2018-10-25T13:13:51","modified_gmt":"2018-10-25T11:13:51","slug":"i1m2018-ejercicios-de-definiciones-por-comprension-2","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2018-ejercicios-de-definiciones-por-comprension-2\/","title":{"rendered":"I1M2018: Ejercicios de definiciones por comprensi\u00f3n (2)"},"content":{"rendered":"<p>En la primera parte de la clase de hoy del curso de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-18\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se han comentado soluciones de 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-- ---------------------------------------------------------------------\n-- Ejercicio 6 (Problema 1 del proyecto Euler) Definir la funci\u00f3n \n--    euler1 :: Int -> Int\n-- tal que (euler1 n) es la suma de todos los m\u00faltiplos de 3 \u00f3 5 menores\n-- que n. Por ejemplo,\n--    euler1 10  ==  23\n-- \n-- Calcular la suma de todos los m\u00faltiplos de 3 \u00f3 5 menores que 1000.\n-- ---------------------------------------------------------------------\n\neuler1 :: Int -> Int\neuler1 n = sum [x | x <- [1..n-1], multiplo x 3 || multiplo x 5]\n  where multiplo x y = mod x y == 0\n\n-- C\u00e1lculo:\n--    ghci> euler1 1000\n--    233168\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 7. Definir la funci\u00f3n \n--    circulo :: Int -> Int\n-- tal que (circulo n) es el la cantidad de pares de n\u00fameros naturales\n-- (x,y) que se encuentran dentro del c\u00edrculo de radio n. Por ejemplo, \n--    circulo 3  ==  9\n--    circulo 4  ==  15\n--    circulo 5  ==  22\n--    circulo 100  ==  7949\n-- ---------------------------------------------------------------------\n\ncirculo :: Int -> Int\ncirculo n = length [(x,y) | x <- [0..n], y <- [0..n], x*x+y*y < n*n]\n\n-- La eficiencia puede mejorarse con\ncirculo2 :: Int -> Int\ncirculo2 n = length [(x,y) | x <- [0..n-1]\n                           , y <- [0..raizCuadradaEntera (n*n - x*x)]\n                           , x*x+y*y < n*n]\n\n-- (raizCuadradaEntera n) es la parte entera de la ra\u00edz cuadrada de\n-- n. Por ejemplo,\n--    raizCuadradaEntera 17  ==  4 \nraizCuadradaEntera :: Int -> Int\nraizCuadradaEntera n = truncate (sqrt (fromIntegral n))\n\n-- Comparaci\u00f3n de eficiencia\n--    \u03bb> circulo (10^4)\n--    78549754\n--    (73.44 secs, 44,350,688,480 bytes)\n--    \u03bb> circulo2 (10^4)\n--    78549754\n--    (59.71 secs, 36,457,043,240 bytes)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 8.1. Definir la funci\u00f3n \n--    aproxE :: Double -> [Double]\n-- tal que (aproXE n) es la lista cuyos elementos son los t\u00e9rminos de la\n-- sucesi\u00f3n (1+1\/m)**m desde 1 hasta n. Por ejemplo, \n--    aproxE 1 == [2.0]\n--    aproxE 4 == [2.0,2.25,2.37037037037037,2.44140625]\n-- ---------------------------------------------------------------------\n\naproxE :: Double -> [Double]\naproxE n = [(1+1\/m)**m | m <- [1..n]]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 8.2. \u00bfCu\u00e1l es el l\u00edmite de la sucesi\u00f3n (1+1\/m)**m ?\n-- ---------------------------------------------------------------------\n\n-- El l\u00edmite de la sucesi\u00f3n es el n\u00famero e. \n\n-- ---------------------------------------------------------------------\n-- Ejercicio 8.3. Definir la funci\u00f3n \n--    errorAproxE :: Double -> Double\n-- tal que (errorE x) es el menor n\u00famero de t\u00e9rminos de la sucesi\u00f3n\n-- (1+1\/m)**m necesarios para obtener su l\u00edmite con un error menor que\n-- x. Por ejemplo, \n--    errorAproxE 0.1    ==  13.0\n--    errorAproxE 0.01   ==  135.0\n--    errorAproxE 0.001  ==  1359.0\n-- Indicaci\u00f3n: En Haskell, e se calcula como (exp 1).\n-- ---------------------------------------------------------------------\n\nerrorAproxE :: Double -> Double\nerrorAproxE x = head [m | m <- [1..], abs (exp 1 - (1+1\/m)**m) < x]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.1. Definir la funci\u00f3n\n--    aproxLimSeno :: Double -> [Double]\n-- tal que (aproxLimSeno n) es la lista cuyos elementos son los t\u00e9rminos\n-- de la sucesi\u00f3n  \n--    sen(1\/m) \n--    --------\n--      1\/m \n-- desde 1 hasta n. Por ejemplo,\n--    aproxLimSeno 1 == [0.8414709848078965]\n--    aproxLimSeno 2 == [0.8414709848078965,0.958851077208406]\n-- ---------------------------------------------------------------------\n\naproxLimSeno :: Double -> [Double]\naproxLimSeno n = [sin(1\/m)\/(1\/m) | m <- [1..n]] \n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.2. \u00bfCu\u00e1l es el l\u00edmite de la sucesi\u00f3n sen(1\/m)\/(1\/m) ?\n-- ---------------------------------------------------------------------\n\n-- El l\u00edmite es 1.\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.3. Definir la funci\u00f3n \n--    errorLimSeno :: Double -> Double\n-- tal que (errorLimSeno x) es el menor n\u00famero de t\u00e9rminos de la sucesi\u00f3n \n-- sen(1\/m)\/(1\/m) necesarios para obtener su l\u00edmite con un error menor\n-- que x. Por ejemplo, \n--    errorLimSeno 0.1     ==   2.0\n--    errorLimSeno 0.01    ==   5.0\n--    errorLimSeno 0.001   ==  13.0\n--    errorLimSeno 0.0001  ==  41.0\n-- ---------------------------------------------------------------------\n\nerrorLimSeno :: Double -> Double\nerrorLimSeno x = head [m | m <- [1..], abs (1 - sin(1\/m)\/(1\/m)) < x]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 10.1. Definir la funci\u00f3n \n--    calculaPi :: Double -> Double\n-- tal que (calculaPi n) es la aproximaci\u00f3n del n\u00famero pi calculada\n-- mediante la expresi\u00f3n \n--    4*(1 - 1\/3 + 1\/5 - 1\/7 + ...+ (-1)**n\/(2*n+1))\n-- Por ejemplo,\n--    calculaPi 3    ==  2.8952380952380956\n--    calculaPi 300  ==  3.1449149035588526\n-- ---------------------------------------------------------------------\n\ncalculaPi :: Double -> Double\ncalculaPi n = 4 * sum [(-1)**x\/(2*x+1) | x <- [0..n]]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 10.2. Definir la funci\u00f3n \n--    errorPi :: Double -> Double\n-- tal que (errorPi x) es el menor n\u00famero de t\u00e9rminos de la serie\n--    4*(1 - 1\/3 + 1\/5 - 1\/7 + ...+ (-1)**n\/(2*n+1))\n-- necesarios para obtener pi con un error menor que x. Por ejemplo,\n--    errorPi 0.1    ==    9.0\n--    errorPi 0.01   ==   99.0\n--    errorPi 0.001  ==  999.0\n-- ---------------------------------------------------------------------\n\nerrorPi :: Double -> Double\nerrorPi x = head [n | n <- [1..]\n                    , abs (pi - calculaPi n) < x]\n<\/pre>\n<p>En la segunda parte se ha realizado un <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2018G4\/index.php\/Ejercicio_de_autoevaluaci%C3%B3n_(24-oct-18)\">ejercicio de autoevaluaci\u00f3n<\/a> en el laboratorio.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la primera parte de la clase de hoy del curso de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se han comentado soluciones de 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":[320],"tags":[270,321],"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\/6282"}],"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=6282"}],"version-history":[{"count":8,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/6282\/revisions"}],"predecessor-version":[{"id":6290,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/6282\/revisions\/6290"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=6282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=6282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=6282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}