I1M2011: Ejercicios con listas infinitas (1)
En la clase de hoy de Informática de 1º del Grado en Matemáticas se han explicado las soluciones de los 3 primeros ejercicios de la 15ª relación sobre listas infinitas y evaluación perezosa. En concreto, se estudian funciones para calcular
- la lista de las potencias de un número menores que otro dado,
- la lista obtenida repitiendo un elemento infinitas veces y
- la lista obtenida repitiendo un elemento un número finito de veces.
Estos ejercicios corresponden al tema 10.
Los ejercicios, y sus soluciones, se muestran a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
-- --------------------------------------------------------------------- -- Importación de librerías auxiliares -- --------------------------------------------------------------------- import Test.QuickCheck -- --------------------------------------------------------------------- -- Ejercicio 1. Definir, usando takeWhile y map, la función -- potenciasMenores :: Int -> Int -> [Int] -- tal que (potenciasMenores x y) es la lista de las potencias de x -- menores que y. Por ejemplo, -- potenciasMenores 2 1000 == [2,4,8,16,32,64,128,256,512] -- --------------------------------------------------------------------- potenciasMenores :: Int -> Int -> [Int] potenciasMenores x y = takeWhile (<y) (map (x^) [1..]) -- --------------------------------------------------------------------- -- Ejercicio 2. Definir, por recursión y comprensión, la función -- repite :: a -> [a] -- tal que (repite x) es la lista infinita cuyos elementos son x. Por -- ejemplo, -- repite 5 == [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,... -- take 3 (repite 5) == [5,5,5] -- Nota: La función repite es equivalente a la función repeat definida -- en el preludio de Haskell. -- --------------------------------------------------------------------- -- Por recursión: repite :: a -> [a] repite x = x : repite x -- Por comprensión: repite' x = [x | _ <- [1..]] -- --------------------------------------------------------------------- -- Ejercicio 3. Definir, por recursión y por comprensión, la función -- repiteFinita :: Int-> a -> [a] -- tal que (repite n x) es la lista con n elementos iguales a x. Por -- ejemplo, -- repiteFinita 3 5 == [5,5,5] -- Nota: La función repite es equivalente a la función replicate definida -- en el preludio de Haskell. -- --------------------------------------------------------------------- -- Por recursión: repiteFinita :: Int -> a -> [a] repiteFinita 0 x = [] repiteFinita n x = x : repiteFinita (n-1) x -- Por comprensión: repiteFinita' :: Int -> a -> [a] repiteFinita' n x = [x | _ <- [1..n]] -- También se puede definir usando repite repiteFinita2 :: Int -> a -> [a] repiteFinita2 n x = take n (repite x) |