{"id":6311,"date":"2018-11-07T14:41:23","date_gmt":"2018-11-07T13:41:23","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=6311"},"modified":"2018-11-08T08:42:16","modified_gmt":"2018-11-08T07:42:16","slug":"i1m2018-1o-examen-de-programacion-funcional-con-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2018-1o-examen-de-programacion-funcional-con-haskell\/","title":{"rendered":"I1M2018: 1\u00ba examen de programaci\u00f3n funcional con Haskell"},"content":{"rendered":"<p>Hoy se ha realizado el 1\u00ba examen del curso de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-18\">Inform\u00e1tica<\/a> (de 1\u00ba de Grado en Matem\u00e1ticas). Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n.<\/p>\n<p><!--more--><\/p>\n<pre lang=\"haskell\">\n-- Inform\u00e1tica (1\u00ba del Grado en Matem\u00e1ticas, Grupo 4)\n-- 1\u00ba examen de evaluaci\u00f3n continua (7 de noviembre de 2018)\n-- ---------------------------------------------------------------------\n\n-- Nota: La puntuaci\u00f3n de cada ejercicio es 2.5 puntos.\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 1. Definir la funci\u00f3n \n--    divisoresPrimos :: Integer -> [Integer]\n-- tal que (divisoresPrimos x) es la lista de los divisores primos de x. \n-- Por ejemplo, \n--    divisoresPrimos 40  ==  [2,5]\n--    divisoresPrimos 70  ==  [2,5,7]\n-- ------------------------------------------------------------------------\n\ndivisoresPrimos :: Integer -> [Integer]\ndivisoresPrimos x = [n | n <- divisores x, primo n]\n\n-- (divisores n) es la lista de los divisores del n\u00famero n. Por ejemplo,\n--    divisores 30  ==  [1,2,3,5,6,10,15,30]  \ndivisores :: Integer -> [Integer]\ndivisores n = [x | x <- [1..n], n `mod` x == 0]\n\n-- (primo n) se verifica si n es primo. Por ejemplo,\n--    primo 30  == False\n--    primo 31  == True  \nprimo :: Integer -> Bool\nprimo n = divisores n == [1, n]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2. Definir la funci\u00f3n\n--    esPotencia :: Integer -> Integer -> Bool\n-- tal que (esPotencia x a) se verifica si x es una potencia de a. Por\n-- ejemplo, \n--    esPotencia 32 2  ==  True\n--    esPotencia 42 2  ==  False\n-- ---------------------------------------------------------------------\n\n-- 1\u00aa definici\u00f3n\nesPotencia :: Integer -> Integer -> Bool\nesPotencia x a = x `elem` [a^n | n <- [0..x]]\n\n-- 2\u00aa definici\u00f3n\nesPotencia2 :: Integer -> Integer -> Bool\nesPotencia2 x a = aux x a 0\n    where aux x a b | b > x     = False\n                    | otherwise = x == a ^ b || aux x a (b+1)\n\n-- 3\u00aa definici\u00f3n \nesPotencia3 :: Integer -> Integer -> Bool\nesPotencia3 0 _ = False\nesPotencia3 1 a = True\nesPotencia3 _ 1 = False\nesPotencia3 x a = rem x a == 0 && esPotencia3 (div x a) a\n\n-- ----------------------------------------------------------------------\n-- Ejercicio 3. Todo n\u00famero entero positivo n se puede escribir como\n-- 2^k*m, con m impar. Se dice que m es la parte impar de n. Por\n-- ejemplo, la parte impar de 40 es 5 porque 40 = 5*2^3.\n-- \n-- Definir la funci\u00f3n \n--    parteImpar :: Integer -> Integer\n-- tal que (parteImpar n) es la parte impar de n. Por ejemplo,\n--    parteImpar 40  ==  5\n-- ----------------------------------------------------------------------\n\nparteImpar :: Integer -> Integer\nparteImpar n | even n    = parteImpar (n `div` 2)\n             | otherwise = n\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 4. Una forma de aproximar el valor del n\u00famero e es usando\n-- la siguiente igualdad: \n--\n--                  1        2        3        4        5\n--            e = ------ + ------ + ------ + ------ + ------ + ...\n--                 2*0!     2*1!     2*2!     2*3!     2*4!\n--\n--\n-- Definir la funci\u00f3n\n--    aproximaE :: Double -> Double\n-- tal que (aproximaE n) es la aproximaci\u00f3n del n\u00famero e calculada con\n-- la serie anterior hasta el t\u00e9rmino n-\u00e9simo. Por ejemplo,\n--    aproximaE 10  ==  2.718281663359788\n--    aproximaE 15  ==  2.718281828458612\n--    aproximaE 20  ==  2.718281828459045\n-- ---------------------------------------------------------------------\n\n-- 1\u00aa definici\u00f3n\n-- =============\n\naproximaE :: Double -> Double\naproximaE n =\n  sum [(i+1) \/ (2 * factorial i) | i <- [0..n]]\n  where factorial i = product [1..i]\n\n-- 2\u00aa definici\u00f3n\n-- =============\n\naproximaE2 :: Double -> Double\naproximaE2 0 = 1\/2\naproximaE2 n = (n+1)\/(2 * factorial n) + aproximaE2 (n-1)\n  where factorial i = product [1..i]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Hoy se ha realizado el 1\u00ba examen del curso de Inform\u00e1tica (de 1\u00ba de Grado en Matem\u00e1ticas). 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":[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\/6311"}],"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=6311"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/6311\/revisions"}],"predecessor-version":[{"id":6312,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/6311\/revisions\/6312"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=6311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=6311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=6311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}