26
Informática de 1 o de Matemáticas Listas por comprensión y Recursión Ejercicio 1 Rectas del plano Consideremos las rectas en el plano, según su ecuación general ax + by + c = 0. Representa- mos esta recta por sus coeficientes abc. 1. Definir la función pendiente:: Double -> Double -> Double -> Double tal que (pendiente a b c) es la pendiente de la recta ax + by + c = 0. Por ejemplo, pendiente (-3) 1 1 => 3.0 pendiente 1 1 1 => -1.0 pendiente 1 0 1 => -Infinity 2. Definir la función corteEjeX:: Double -> Double -> Double -> (Double,Double) tal que (corteEjeX a b c) es el punto de corte de la recta ax + by + c = 0 con el eje X o un error con el mensaje "La recta es paralela al eje X"si la recta no corta al eje X. Por ejemplo, *Main> corteEjeX 1 3 1 (-1.0,0.0) *Main> corteEjeX 1 1 1 (-1.0,0.0) *Main> corteEjeX (-1) 1 3 (3.0,0.0) *Main> corteEjeX 0 8 3 *** Exception: La recta es paralela al eje X 3. Definir la función corteEjeY:: Double -> Double -> Double -> (Double,Double) tal que (corteEjeY a b c) es el punto de corte de la recta ax + by + c = 0 con el eje Y o un error con el mensaje "La recta es paralela al eje Y"si la recta no corta al eje Y. Por ejemplo, *Main> corteEjeY 1 1 1 (0.0,-1.0) *Main> corteEjeY 1 8 1 (0.0,-8.0) *Main> corteEjeY 1 0 1 *** Exception: La recta es paralela al eje Y Ejercicio 2 Extracciones e inserciones

Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Informática de 1o de Matemáticas

Listas por comprensión y Recursión

Ejercicio 1 Rectas del planoConsideremos las rectas en el plano, según su ecuación general ax + by + c = 0. Representa-

mos esta recta por sus coeficientes a b c.

1. Definir la función

pendiente:: Double -> Double -> Double -> Double

tal que (pendiente a b c) es la pendiente de la recta ax + by + c = 0. Por ejemplo,

pendiente (-3) 1 1 => 3.0pendiente 1 1 1 => -1.0pendiente 1 0 1 => -Infinity

2. Definir la función

corteEjeX:: Double -> Double -> Double -> (Double,Double)

tal que (corteEjeX a b c) es el punto de corte de la recta ax + by + c = 0 con el eje X o unerror con el mensaje "La recta es paralela al eje X"si la recta no corta al eje X. Por ejemplo,

*Main> corteEjeX 1 3 1(-1.0,0.0)*Main> corteEjeX 1 1 1(-1.0,0.0)*Main> corteEjeX (-1) 1 3(3.0,0.0)*Main> corteEjeX 0 8 3*** Exception: La recta es paralela al eje X

3. Definir la función

corteEjeY:: Double -> Double -> Double -> (Double,Double)

tal que (corteEjeY a b c) es el punto de corte de la recta ax + by + c = 0 con el eje Y o unerror con el mensaje "La recta es paralela al eje Y"si la recta no corta al eje Y. Por ejemplo,

*Main> corteEjeY 1 1 1(0.0,-1.0)*Main> corteEjeY 1 8 1(0.0,-8.0)*Main> corteEjeY 1 0 1*** Exception: La recta es paralela al eje Y

Ejercicio 2 Extracciones e inserciones

Page 2: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

1. Definir la función extrae tal que (extrae xs n) es la lista resultado de eliminar el elementon-ésimo de la lista xs. Si n es negativo o mayor que la longitud de la lista el resultado debeser la misma lista. Por ejemplo,

extrae [1,2,3,4,5] 2 ==> [1,2,4,5]extrae [1,2,3,4,5] 4 ==> [1,2,3,4]extrae [1,2,3,4,5] (-1) ==> [1,2,3,4,5]extrae [1,2,3,4,5] 7 ==> [1,2,3,4,5]

Nota: (drop n xs) es la lista obtenida eliminando los n primeros elementos de xs.

2. Definir la función inserta tal que (inserta xs e n) debe introducir el elemento e en laposición n de la lista xs. Si n <= 0 el elemento e se insertará al principio de la lista, y si nes igual o mayor que la longitud de la lista, el elemento e se colocará al final de la lista. Porejemplo,

inserta [1,3,5] 7 1 ==> [1,7,3,5]inserta [1,3,5] 7 3 ==> [1,3,5,7]inserta [1,3,5] 7 (-1) ==> [7,1,3,5]inserta [1,3,5] 7 9 ==> [1,3,5,7]

3. Comprobar con QuickCheck que si se inserta el elemento n-ésimo de una lista xs en el resul-tado de extraer el elemento n-ésimo de xs se obtiene la lista xs.

Ejercicio 3 Haciendo uso de la lista [1..10] definir las siguientes listas por comprensión.

lista1 = [11,12,13,14,15,16,17,18,19,20]lista2 = [[2],[4],[6],[8],[10]]lista3 = [10,9,8,7,6,5,4,3,2,1]lista4 = [True,False,True,False,True,False,True,False,True,False]lista5 = [(3,True),(6,True),(9,True),(12,False),(15,False),(18,False)]lista6 = [(11,12),(13,14),(15,16),(17,18),(19,20)]lista7 = [[5,6,7],[5,6,7,8,9],[5,6,7,8,9,10,11],[5,6,7,8,9,10,11,12,13]]

Nota: La forma general de las definiciones que debes dar deben ser de la forma: [... | x <-[1..10], ...]

Ejercicio 4 Usando una lista por comprensión, definir la constante sumaDeCuadrados cuyo valorsea la suma 12 + 22 + ..,1002 y calcular su valor.

Ejercicio 5 Suma de cuadrados

1. Definir por recursión la función sumaCuadrados tal que (sumaCuadrados n) es la suma delos cuadrados de los números de 1 a n. Por ejemplo,

sumaCuadrados 4 => 30

2. Comprobar con QuickCheck si sumaCuadrados n es igual a

n(n + 1)(2n + 1)6

Page 3: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 6

1. Definir, por comprensión, la función

cuadradosC :: [Integer] -> [Integer]

tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por ejemplo,

cuadradosC [1,2,3] ==> [1,4,9]

2. Definir, por recursión, la función

cuadradosR :: [Integer] -> [Integer]

tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por ejemplo,

cuadradosR [1,2,3] ==> [1,4,9]

3. Escribir el cálculo de (cuadradosR [1,3,3]).

Ejercicio 7

1. Definir, por comprensión, la función

imparesC :: [Integer] -> [Integer]

tal que (imparesC xs) es la lista de los números impares de xs. Por ejemplo,

imparesC [1,2,3] ==> [1,3]

2. Definir, por recursión, la función

imparesR :: [Integer] -> [Integer]

tal que (imparesR xs) es la lista de los números impares de xs. Por ejemplo,

imparesR [1,2,3] ==> [1,3]

3. Escribir el cálculo de (imparesR [1,3,3]).

Ejercicio 8

1. Definir, por comprensión, la función

imparesCuadradosC :: [Integer] -> [Integer]

tal que (imparesCuadradosC xs) es la lista de los cuadrados de los números impares de xs.Por ejemplo,

imparesCuadradosC [1,2,3] ==> [1,9]

2. Definir, por recursión, la función

imparesCuadradosR :: [Integer] -> [Integer]

tal que (imparesCuadradosR xs) es la lista de los cuadrados de los números impares de xs.Por ejemplo,

Page 4: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

imparesCuadradosR [1,2,3] ==> [1,9]

3. Escribir el cálculo de (imparesCuadradosR [1,3,3]).

Ejercicio 9

1. Definir, por comprensión, la función

sumaCuadradosImparesC :: [Integer] -> Integer

tal que (sumaCuadradosImparesC xs) es la suma de los cuadrados de los números imparesde la lista xs. Por ejemplo,

sumaCuadradosImparesC [1,2,3] ==> 10

2. Definir, por recursión, la función

sumaCuadradosImparesR :: [Integer] -> Integer

tal que (sumaCuadradosImparesR xs) es la suma de los cuadrados de los números imparesde la lista xs. Por ejemplo,

sumaCuadradosImparesR [1,2,3] ==> 10

Ejercicio 10

1. Definir por comprensión la función

replica :: Int -> a -> [a]

tal que (replica n x) es la lista formada por n copias del elemento x. Por ejemplo,

*Main> replica 3 True[True, True, True]

2. Comprobar con QuickCheck que para todo número entero positivo n (menor que 100) y todoelemento x, se tiene que la longitud de (replica n x) es n.

Nota: No utilizar la función replicate.

Ejercicio 11 Una terna (x,y,z) de enteros positivos es pitagórica si x2 + y2 = z2.

1. Usando una lista por comprensión, definir la función

pitagoricas :: Int -> [(Int, Int, Int)]

tal que (pitagoricas n) es la lista de todas las ternas pitagóricas cuyas componentes estánentre 1 y n. Por ejemplo,

*Main> pitagoricas 10[(3,4,5),(4,3,5),(6,8,10),(8,6,10)]

2. Definir la función

numeroDePares :: (Int,Int,Int) -> Int

Page 5: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

tal que (numeroDePares t) es el número de elementos pares de la terna t. Por ejemplo,

numeroDePares (3,5,7) => 0numeroDePares (3,6,7) => 1numeroDePares (3,6,4) => 2numeroDePares (4,6,4) => 3

3. Definir la función

conjetura :: Int -> Bool

tal que (conjetura n) se verifica si todas las ternas pitagóricas cuyas componentes estánentre 1 y n tiene un número impar de números pares. Por ejemplo,

conjetura 10 => True

4. Demostrar la conjetura para todas las ternas pitagóricas.

Ejercicio 12 Un entero positivo es perfecto si es igual a la suma de sus factores, excluyendo elpropio número. Definir la función

perfectos :: Int -> [Int]

tal que (perfectos n) es la lista de todos los números perfectos menores que n. Por ejemplo:

*Main> perfectos 500[6,28,496]

Nota Usar una lista por comprensión y la siguiente función

factores :: Int -> [Int]factores n = [x | x <- [1..n], n ‘mod‘ x == 0]

Ejercicio 13 El producto escalar de dos listas de enteros xs y ys, ambas de la misma longitud,viene dado por la suma de los productos de los elementos correspondientes. Definir por com-prensión la función

productoEscalar :: [Int] -> [Int] -> Int

tal que (productoEscalar xs ys) es el producto escalar de las listas xs e ys. Por ejemplo,

productoEscalar [1,2,3] [4,5,6] => 32

Usar QuickCheck para comprobar la propiedad conmutativa del producto escalar.

Ejercicio 14 Máximo común divisorDados dos números naturales, a y b, es posible calcular su máximo común divisor mediante

el Algoritmo de Euclides. Este algoritmo se puede resumir en la siguiente fórmula:

mcd(a, b) =

{a si b = 0mcd(b, a módulo b) si b > 0

1. Definir la función mcd

Page 6: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

2. Definir y comprobar la propiedad prop_mcd según la cual el máximo común divisor de dosnúmeros naturales a y b (ambos mayores que 0) es siempre mayor o igual que 1 y ademáses menor o igual que el menor de los números a y b.

3. Teniendo en cuenta que buscamos el máximo común divisor de a y b, sería razonable pensarque el máximo común divisor siempre sería igual o menor que la mitad del máximo de a yb. Definir esta propiedad y comprobarla.

Ejercicio 15 Medidas de centralización

1. Definir la función

media :: [Double] -> Double

que calcule la media aritmética de una lista numérica. Por ejemplo,

media [1,2,3] ==> 2.0media [1,-2,3.5,4] ==> 1.625

Nota: La expresión (fromIntegral x) es el número real correspondiente al número enterox.

2. Definir la función

mediana :: [Double] -> Double

que calcule la mediana de una lista numérica; esto es, el valor que deja el mismo número dedatos menores y mayores que él (si la lista contiene un número par de elementos, la medianaserá la media aritmética de los dos valores centrales). Por ejemplo,

mediana [3,2,5,1,4] ==> 3.0mediana [-1,7,8,1] ==> 4.0

Notas:

(sort xs) es el resultado de ordenar la lista xs.

(xs !! n) es el n-ésimo elemento de xs.

3. La función

divideMedia :: [Double] -> [[Double]]

dada una lista numérica, xs, calcula la lista [ys,zs], donde ys contiene los elementos de xsestrictamente menores que la media, mientras que zs contiene los elementos de xs estricta-mente mayores que la media. Por ejemplo,

divideMedia [6,7,2,8,6,3,4] ==> [[2.0,3.0,4.0],[6.0,7.0,8.0,6.0]]divideMedia [1,2,3] ==> [[1.0],[3.0]]

Dar una definición por filtrado, otra por comprensión y otra por recursión. Comprobar conQuickCheck que las tres definiciones son equivalentes.

Page 7: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

4. Comprobar con QuickCheck que si [ys,zs] es el resultado obtenido al aplicar la funcióndivideMedia a xs

entonces la suma de las longitudes de ys y zs es menor o igual que la longitud de xs.

entonces todos los elementos de ys son menores que todos los elementos de zs.

entonces la media de xs no pertenece a ys ni a zs.

5. Dada una lista, xs, sus valores externos son aquellos valores menores que

media xs− máximo xs− mínimo xs2

o mayores que

media xs+máximo xs− mínimo xs

2Definir, por comprensión, la función

valoresExternos:: [Double] -> [Double]

que calcula los valores externos de una lista numérica. Por ejemplo,

valoresExternos [1,2,5,5,5,5,5,5] ==> [1.0,2.0]valoresExternos [5,5,5,5,5,5,8,9] ==> [8.0,9.0]valoresExternos [1,2,5,5,5,5,5,5,8,9] ==> []

6. Comprobar con QuickCheck si se verifica alguna de las siguientes propiedades:

La media de una lista no vacía es mayor o igual que la mediana.

La media de una lista no vacía es menor o igual que la mediana.

La media de una lista no vacía es menor o igual que

minimo + maximo2

Ejercicio 16 Definir la función filtra que reciba una lista numérica xs y un número d, entre 0 y100, y devuelva la lista de los elementos de xs que se desvían como máximo un d % de la mediade xs; es decir, los elementos x de xs tales que

(1− d100

)M ≤ x ≤ (1 +d

100)M

donde M es la media de los elementos de xs. Por ejemplo,

filtra [1,2,3,4,5] 10 => [3.0]filtra [1,2,3,4,5] 50 => [2.0,3.0,4.0]filtra [1,2,3,4,5] 75 => [1.0,2.0,3.0,4.0,5.0]

Ejercicio 17 Definir la función mediaG que calcule la media geométrica de una lista de númerosreales positivos. Si la lista es vacía debe devolver 1. Por ejemplo,

mediaG [1,3,5,7] => 3.2010858729436795mediaG [2.5,1.3] => 1.8027756377319946mediaG [] => 1.0

Page 8: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 18 Reconocimiento de permutacionesUna permutación de una lista es otra lista con los mismos elementos, pero posiblemente en

distinto orden. Por ejemplo, [1,2,1] es una permutación de [2,1,1] pero no de [1,2,2]. En esteejercicio vamos a estudiar las permutaciones.

1. Definir la función

borra :: Eq a => a -> [a] -> [a]

tal que (borra x xs) es la lista obtenida borrando una ocurrencia de x en la lista xs. Porejemplo,

borra 1 [1,2,1] ==> [2,1]borra 3 [1,2,1] ==> [1,2,1]

2. Definir la función esPermutación tal que (esPermutación xs ys) se verifique si xs es unapermutación de ys. Por ejemplo,

esPermutación [1,2,1] [2,1,1] ==> TrueesPermutación [1,2,1] [1,2,2] ==> False

3. Comprobar con QuickCheck que si una lista es una permutación de otra, las dos tienen elmismo número de elementos.

4. Comprobar con QuickCheck que la inversa de una lista es una permutación de la lista.

Ejercicio 19

1. Definir por recursión la función

potencia :: Integer -> Integer -> Integer

tal que (potencia x n) es x elevado al número natural n. Por ejemplo,

potencia 2 3 => 8

2. Mostrar cómo se evalúa (potencia 2 3).

3. Comprobar con quickCheck que la función potencia es equivalente a la predefinida ()̂.

Ejercicio 20

1. Definir por recursión la función

mezcla :: Ord a => [a] -> [a] -> [a]

tal que (mezcla xs ys) es la lista obtenida mezclando las listas ordenadas xs e ys. Porejemplo,

mezcla [2,5,6] [1,3,4] => [1,2,3,4,5,6]

2. Definir la función

ordenada :: Ord a => [a] -> Bool

Page 9: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

tal que (ordenada xs) se verifica si xs es una lista ordenada. Por ejemplo,

ordenada [2,3,5] => Trueordenada [2,5,3] => False

3. Comprobar con quickCheck que la mezcla de dos listas ordenadas es una lista ordenada.

4. Comprobar con QuickCheck que la mezcla de dos listas es una permutación de su unión.

Nota: Usar la definición de esPermutación del ejercicio 18

5. Definir la función

mitades :: [a] -> ([a],[a])

tal que (mitades xs) es el par formado por las dos mitades en que se divide xs tales quesus longitudes difieren como máximo en uno. Por ejemplo,

mitades [2,3,5,7,9] => ([2,3],[5,7,9])

6. Definir la función

ordMezcla :: Ord a => [a] -> [a]

tal que (ordMezcla xs) es la lista obtenida ordenado xs por mezcla (es decir, considerandoque la lista vacía y las listas unitarias están ordenadas y cualquier otra lista se ordena mez-clando las dos listas que resultan de ordenar sus dos mitades por separado). Por ejemplo,

ordMezcla [5,2,3,1,7,2,5] => [1,2,2,3,5,5,7]

7. Comprobar con QuickCheck que la ordenación por mezcla de una lista es una lista ordenada.

8. Comprobar con QuickCheck que la ordenación por mezcla de una lista es una permutaciónde la lista.

Ejercicio 21

1. Definir, usando funciones predefinidas, la función

entreL :: Integer -> Integer -> [Integer]

tal que (entreL m n) es la lista de los números entre m y n. Por ejemplo,

entreL 2 5 ==> [2,3,4,5]

2. Definir, por recursión, la función

entreR :: Integer -> Integer -> [Integer]

tal que (entreR m n) es la lista de los números entre m y n. Por ejemplo,

entreR 2 5 ==> [2,3,4,5]

Ejercicio 22

1. Definir, por comprensión, la función

Page 10: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

mitadParesC :: [Int] -> [Int]

tal que (mitadParesC xs) es la lista de las mitades de los elementos de xs que son pares.Por ejemplo,

mitadParesC [0,2,1,7,8,56,17,18] ==> [0,1,4,28,9]

2. Definir, por recursión, la función

mitadParesR :: [Int] -> [Int]

tal que (mitadParesR xs) es la lista de las mitades de los elementos de xs que son pares.Por ejemplo,

mitadParesR [0,2,1,7,8,56,17,18] ==> [0,1,4,28,9]

3. Comprobar con QuickCheck que ambas definiciones son equivalentes.

Ejercicio 23

1. Definir, por comprensión, la función

enRangoC :: Int -> Int -> [Int] -> [Int]

tal que (enRangoC a b xs) es la lista de los elementos de xs menores o iguales que a ymenores o iguales que b. Por ejemplo,

enRangoC 5 10 [1..15] ==> [5,6,7,8,9,10]

2. Definir, por recursión, la función

enRangoR :: Int -> Int -> [Int] -> [Int]

tal que (enRangoR a b xs) es la lista de los elementos de xs menores o iguales que a ymenores o iguales que b. Por ejemplo,

enRangoR 5 10 [1..15] ==> [5,6,7,8,9,10]

3. Comprobar con QuickCheck que ambas definiciones son equivalentes.

Ejercicio 24

1. Definir, por comprensión, la función

sumaPositivosC :: [Int] -> Int

tal que (sumaPositivosC xs) es la suma de los números positivos de xs. Por ejemplo,

sumaPositivosC [0,1,-3,-2,8,-1,6] ==> 15

2. Definir, por recursión, la función

sumaPositivosR :: [Int] -> Int

tal que (sumaPositivosR xs) es la suma de los números positivos de xs. Por ejemplo,

Page 11: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

sumaPositivosR [0,1,-3,-2,8,-1,6] ==> 15

3. Comprobar con QuickCheck que ambas definiciones son equivalentes.

Ejercicio 25 Una persona es tan agarrada que sólo compra cuando le hacen un descuento del10 % y el precio (con el descuento) es menor o igual que 199.

1. Definir, usando comprensión, la función

agarradoC :: [Float] -> Float

tal que (agarradoC ps) es el precio que tiene que pagar por una compra cuya lista de precioses ps. Por ejemplo,

agarradoC [45.00, 199.00, 220.00, 399.00] ==> 417.59998

2. Definir, por recursión, la función

agarradoR :: [Float] -> Float

tal que (agarradoR ps) es el precio que tiene que pagar por una compra cuya lista de precioses ps. Por ejemplo,

agarradoR [45.00, 199.00, 220.00, 399.00] ==> 417.59998

3. Comprobar con QuickCheck que ambas definiciones son similares; es decir, el valor absolutode su diferencia es menor que una diezmilésima.

Ejercicio 26

1. Definir, por comprensión, la función

sumaDigitosC :: String -> Int

tal que (sumaDigitosC xs) es la suma de los dígitos de la cadena xs. Por ejemplo,

sumaDigitosC "SE 2431 X" ==> 10

2. Definir, por recursión, la función

sumaDigitosR :: String -> Int

tal que (sumaDigitosR xs) es la suma de los dígitos de la cadena xs. Por ejemplo,

sumaDigitosR "SE 2431 X" ==> 10

3. Comprobar con QuickCheck que ambas definiciones son equivalentes.

Nota: Usar las funciones isDigit y digitToInt del módulo Data.Char

Ejercicio 27

1. Definir, por comprensión, la función

mayusculaInicialC :: String -> String

Page 12: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

tal que (mayusculaInicialC xs) es la palabra xs con la letra inicial en mayúscula y lasrestantes en minúsculas. Por ejemplo,

mayusculaInicialC "sEviLLa" ==> "Sevilla"

2. Dar una definición recursiva de la función anterior.

mayusculaInicialR :: String -> String

3. Comprobar con QuickCheck que ambas definiciones son equivalentes.

Nota: Usar las funciones toLower y toUpper del módulo Data.Char.

Ejercicio 28 Se consideran las siguientes reglas de mayúsculas iniciales para los títulos:

la primera palabra comienza en mayúscula y

todas las palabras que tienen 4 letras como mínimo empiezan con mayúsculas

1. Definir, por comprensión, la función

tituloC :: [String] -> [String]

tal que (titulo ps) es la lista de las palabras de ps con las reglas de mayúsculas inicialesde los títulos. Por ejemplo,

*Main> titulo ["eL","arTE","DE","La","proGraMacion"]["El","Arte","de","la","Programacion"]

2. Dar una definición recursiva de la función anterior.

tituloR :: [String] -> [String]

3. Comprobar con QuickCheck que ambas definiciones son equivalentes.

Ejercicio 29

1. Definir, por comprensión, la función

buscaCrucigramaC :: Char -> Int -> Int -> [String] -> [String]

tal que (buscaCrucigramaC l pos lon ps) es la lista de las palabras, de la lista de palabrasps, que tienen longitud lon y poseen la letra l en la posición pos (comenzando en 0). Porejemplo,

buscaCrucigrama ’c’ 1 7 ["ocaso", "casa", "ocupado"] ==> ["ocupado"]

2. Dar una definición recursiva de la función anterior.

buscaCrucigramaR :: Char -> Int -> Int -> [String] -> [String]

3. Comprobar con QuickCheck que ambas definiciones son equivalentes.

Ejercicio 30

Page 13: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

1. Definir, por comprensión, la función

posicionesC :: String -> Char -> [Int]

tal que (posiciones xs y) es la lista de la posiciones del carácter y en la cadena xs. Porejemplo,

posicionesC "Salamanca" ’a’ ==> [1,3,5,8]

2. Dar una definición recursiva de la función anterior.

posicionesR :: String -> Char -> [Int]

3. Comprobar con QuickCheck que ambas definiciones son equivalentes.

Ejercicio 31 Definir, por comprensión y por recursión, la función

contiene :: String -> String -> Bool

tal que (contiene xs ys) se verifica si ys es una subcadena de xs. Por ejemplo,

contiene "escasamente" "casa" ==> Truecontiene "escasamente" "cante" ==> Falsecontiene "" "" ==> True

Comprobar con QuickCheck que ambas definiciones son equivalentes.Nota: Se puede usar la predefinida (isPrefixOf ys xs) que se verifica si ys es un prefijo de

xs (del módulo Data.List).

Ejercicio 32 Se considera la función

filtraAplica :: (a -> b) -> (a -> Bool) -> [a] -> [b]

tal que (filtraAplica f p xs) es la lista obtenida aplicándole a los elementos de xs que cumplenel predicado p la función f. Por ejemplo,

filtraAplica (4+) (<3) [1..7] => [5,6]

Se pide, definir la función

por comprensión,

usando map y filter,

por recursión y

por plegado (con foldr).

Ejercicio 33 Definir por recursión la función

seleccionaMientras :: (a -> Bool) -> [a] -> [a]

tal que (seleccionaMientras p xs) es la lista de los elemento de xs hasta el primero que nocumple la propiedad p. Por ejemplo,

seleccionaMientras (<7) [2,3,9,4,5] => [2,3]

Page 14: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Nota: No utilizar la función takeWhile

Ejercicio 34 Definir por recursión la función

eliminaMientras :: (a -> Bool) -> [a] -> [a]

tal que (eliminaMientras p xs) es la lista que se obtiene eliminando los elemento de xs hasta elprimero que no cumple la propiedad p. Por ejemplo,

eliminaMientras (<7) [2,3,9,4,5] => [9, 4, 5]

Nota: No utilizar la función dropWhile

Ejercicio 35 Definir la sucesión de Fibonacci como una lista infinita. Y a partir de ella, definir lafunción que devuelve el término n-ésimo de dicha sucesión.

Ejercicio 36 El Teorema de Fermat (1637) dice que si n > 2, entonces no existen tríadas de núme-ros (x, y, z) tales que xn + yn = zn (salvo la solución trivial de x = y = z = 0).

Aunque se llama Teorema de Fermat, él solo lo conjeturó, dándose la primera prueba parcialpor Euler para el caso n = 3.

No sería hasta mucho tiempo después (1995) que el matemático Andrew Willes junto conRichard Taylor dieron una demostración completa (realmente demostraron otro resultado que loimplicaba).

Para el caso n = 2 sí se pueden encontrar tríadas de números verificando la igualdad anterior.De hecho, los lados de un triángulo rectángulo verifican dicha propiedad.

Construir una función, triadas, que dado un número k, devuelva las tríadas que verifican laecuación anterior (con n = 2) con los tres números menores o iguales a k.

Ejercicio 37 El triángulo de Pascal (o de Tartaglia) se forma de la siguiente forma:1

1 11 2 1

1 3 3 11 4 6 4 1

1 5 10 10 5 1Cada elemento de una fila se consigue sumando los dos elementos contiguos de la fila ante-

rior (si es un elemento de una esquina, se considera que el otro sumando es 0).

1. Dar una función que dada, como una lista, una de las filas del triángulo anterior, devuelvaotra lista con los números de la fila que le sigue.

Usar la función anteriormente definida para obtener el triángulo anterior (como lista delistas) hasta un nivel dado.

2. Comprobar con QuickCheck, que la fila n-ésima del triángulo de Pascal tiene n elementos.

Nota: Usar la función fromIntegral para transformar un valor de Int a Integer.

3. Comprobar con QuickCheck, que la suma de los elementos de la fila n-ésima del triángulode Pascal es igual a 2(n−1).

Page 15: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

4. Comprobar con QuickCheck, que el m-ésimo elemento de la fila (n+1)-ésima del triángulo dePascal es el número combinatorio (

nm

)=

n!m!(n−m)!

Ejercicio 38 Dar una función que devuelva una lista con todos los índices (el primer elemento deuna lista tiene índice 0) de los elementos de una lista que verifiquen el predicado. Por ejemplo:

encuentraIndices (>3) [0,2,4,6,8] ==> [2,3,4]encuentraIndices (==3) [0,2,4,6,8] ==> []

Ejercicio 39 Dar una función que dadas una lista de predicados 1-arios, y una lista, devuelva lalista de listas formadas por los elementos que verifican cada uno de los predicados.

multiFiltro [even,odd,(\ x-> x<3)] [1..10] ==> [[2,4,6,8,10],[1,3,5,7,9],[1,2]]

Ejercicio 40 El algoritmo de Euclides para calcular el máximo común divisor de dos númerosnaturales a y b es el siguiente:

Si b = 0, entonces mcd(a,b) = a.Si b > 0, entonces mcd(a,b) = mcd(b,c),

donde c es el resto de dividir a entre b.

Definir la función mcd que dados dos números naturales, y devuelva el máximo común divisor deambos, usando el algoritmo de Euclides para calcularlo.

mcd 2 3 => 1mcd 12 30 => 6mcd 700 300 => 100

Ejercicio 41 Queremos formar una escalera con bloques cuadrados, de forma que tenga un nú-mero determinado de escalones. Por ejemplo, una escalera con tres escalones tendría la siguienteforma:

XXXXXXXXXXXX

Definir la función numeroBloques que dado el número de escalones de la escalera, devuelva elnúmero de bloques necesarios para construirla.

numeroBloques 1 => 2numeroBloques 3 => 12numeroBloques 10 => 110

Ejercicio 42 Definir la función sumaDigitos que dado un número natural n devuelva la suma desus dígitos.

sumaDigitos 3 => 3sumaDigitos 245 => 11sumaDigitos 20045 => 11

Page 16: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 43 Definir la función esDigito que dados un dígito d y un número natural n, determinesi d es un dígito de n. Por ejemplo,

esDigito 0 101 => TrueesDigito 3 101 => FalseesDigito 5 543210 => True

Ejercicio 44 Definir la función pegaNumeros que dados dos números naturales devuelva el núme-ro resultante de "pegarlos". Por ejemplo,

pegaNumeros 12 987 => 12987pegaNumeros 1204 7 => 12047pegaNumeros 100 100 => 100100

Ejercicio 45

1. Definir la función primeraCifra que dado un número natual y devuelva la primera cifra delmismo. Por ejemplo,

primeraCifra 425 => 4

2. Definir la función ultimaCifra que dado un número natural devuelva la última cifra delmismo. Por ejemplo,

ultimaCifra 425 => 5

3. Definir la función inverso que dado un número natural devuelva el número que se obtieneal escribir sus cifras en orden inverso. Por ejemplo,

inverso 42578 => 87524

Ejercicio 46 Definir una función esCapicua que determine si un número natural es capicúa.

esCapicua 1234 => FalseesCapicua 1221 => TrueesCapicua 4 => True

Ejercicio 47 Definir la función mayorExponente que dados dos números naturales, a y b, devuelvael exponente de la mayor potencia de a que es menor o igual que b. Por ejemplo,

mayorExponente 2 8 => 3mayorExponente 2 9 => 3mayorExponente 5 100 => 2

Ejercicio 48 Definir la función sumaListas que, dadas dos listas numéricas de la misma longitud,las sume elemento a elemento. Por ejemplo,

sumaListas [] [] => []sumaListas [2,4] [2,8] => [4,12]sumaListas [1,4,6] [3,7,2] => [4,11,8]

Ejercicio 49 Definir la función intercala que dadas dos listas de la misma longitud, devuelva lalista resultante de intercalar los elementos de cada una de las listas. Por ejemplo

Page 17: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

intercala [] [] => []intercala [1,2,3] [4,5,6] => [1,4,2,5,3,6]intercala "ab" "cd" => "acbd"

Ejercicio 50 Definir la relación esSubconjunto tal que (esSubconjunto xs ys) se verifica si todoslos elementos de xs pertenecen a ys. Por ejemplo,

esSubconjunto "abac" "cba" ==> TrueesSubconjunto "abacd" "cba" ==> False

Nota: La expresión (elem x xs) se verifica si x pertenece a xs.

Ejercicio 51 1. Definir la función eliminaDuplicados que dada una lista devuelva la lista queresulta al eliminar los elementos repetidos de la misma, salvo la última ocurrencia. Por ejem-plo,

eliminaDuplicados [3, 1, 2, 3, 2, 1, 4] => [3,2,1,4]eliminaDuplicados [2.3, 1, 5, 1, 2.3] => [5.0,1.0,2.3]

Nota: La función nub (definida en Data.List) elimina los duplicados manteniendo la pri-mera ocurrencia. Por ejemplo,

nub [1,3,1,2] => [1,3,2]

2. Definir la función esConjunto que determine si una lista es un conjunto; es decir, no contieneelementos duplicados, Por ejemplo,

esConjunto [1,2,3,4,5] ==> TrueesConjunto [1,2,3,2] ==> False

Nota: La expresión (notElem x xs) se verifica si x no pertenece a xs.

3. Comprobar con QuickCheck que el valor de eliminaDuplicados es siempre un conjunto.

4. ¿Se puede garantizar con la propiedad anterior que eliminaDuplicados se comporta correc-tamente? En caso negativo, ¿qué propiedad falta?

Ejercicio 52 Definir el operador &= tal que (xs &= ys) se verifique si las listas xs e ys son igualescomo conjuntos; es decir cada una es un subconjunto de la otra. Por ejemplo,

[1,2,3] &= [3,2,1] ==> True[1,2,3] &= [1,2] ==> False[1,2,3] &= [1,2,3,2,1] ==> True

Ejercicio 53 Comprobar con QuickCheck las siguientes propiedades de la función union (del mó-dulo Data.List):

xs está contenido en (union xs ys).

ys está contenido en (union xs ys).

si xs e ys están contenido en zs, entonces (union xs ys) está contenido en zs.

Page 18: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 54

1. Definir la función interseccion tal que (interseccion xs ys) es el conjunto de los ele-mentos comunes de las listas xs e ys. Por ejemplo,

interseccion [1,2,3] [1,2,3] ==> [1,2,3]interseccion [1,3,5,7] [3,4,5] ==> [3,5]interseccion [1,3,5,1,7] [3,4,5,3] ==> [3,5]interseccion [1,3,5,1,7,3] [3,4,5,3] ==> [5,3]

2. Comprobar con QuickCheck que interseccion siempre devuelve un conjunto.

3. Comprobar con QuickCheck las siguientes propiedades de interseccion:

la (interseccion xs ys) está contenido en xs

la (interseccion xs ys) está contenido en ys

si zs está contenido en xs e ys, entonces zs está contenido en (interseccion xs ys).

4. En el módulo Data.List está definida la función intersect. Comprobar con QuickChecksi es equivalente a la función interseccion que hemos definido. En el caso que no lo sea,establecer una relación entre las dos funciones y comprobarla con QuickCheck.

Ejercicio 55

1. Definir la función diferencia tal que (diferencia xs ys) es el conjunto de los elementosde xs que no pertenecen a ys. Por ejemplo,

diferencia [1,2,3,4,5] [1,3,5] ==> [2,4]diferencia [1,3,5,3,7,1] [2,4,3,6,3,5,8] ==> [7,1]

2. Comprobar con QuickCheck que la diferencia siempre devuelve un conjunto.

3. Comprobar con QuickCheck las siguientes propiedades de la diferencia:

la (diferencia xs ys) está contenido en xs

la (diferencia xs ys) es disjunta con ys; es decir la intersección entre la (diferenciaxs ys) e ys es el conjunto vacío.

4. En el módulo Data.List está definido el operador (\\). Comprobar con QuickCheck si esequivalente a la función diferencia que hemos definido. En el caso que no lo sea, estableceruna relación entre las dos funciones y comprobarla con QuickCheck.

5. Comprobar con QuickCheck si (union xs ys) es igual, como conjunto, que la concatenacióndel conjunto correspondiente a xs y su diferencia con ys.

Ejercicio 56 Definir la función intercambia que dados dos datos x e y y una lista zs, devuelva lalista resultante de cambiar las ocurrencias de x en zs por y, y las ocurrencias de y en zs por x. Porejemplo,

intercambia ’a’ ’b’ "cdbabf" => "cdabaf"intercambia 1 2 [] => []intercambia [1] [2] [[3],[1],[1,2],[2]] => [[3],[2],[1,2],[1]]

Page 19: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 57 Definir la función ciclo que permute cíclicamente los elementos de una lista. Si lalista es vacía debe devolver []. Por ejemplo,

ciclo [2, 5, 7, 9] => [9,2,5,7]ciclo ["yo", "tu", "el"] => ["el","yo","tu"]ciclo [] => []

Ejercicio 58 Definir la función bocata que reciba dos datos x e y y una lista zs, y devuelva la listaresultante de insertar y a izquierda y derecha de cada ocurrencia de x en zs. Por ejemplo,

bocata 1 2 [] ==> []bocata 1 2 [3, 1] ==> [3,2,1,2]bocata "queso" "pan" ==> ["queso","tomate","queso","jamon","lechuga"]

["pan","queso","pan","tomate","pan","queso","pan","jamon","lechuga"]

Ejercicio 59 Definir un procedimiento sumaExponenciales, que reciba una lista de números en-teros, y devuelva la suma de las exponenciales de cada número elevado a sí mismo. Por ejemplo,

sumaExponenciales [1,2,3,4] = 1 + 4 + 27 + 256 = 288

Ejercicio 60 Hay números, como el 7393913, que son primos y, además, todos los números que seobtienen al ir quitando la última cifra también son primos: 739391, 73939, 7393, 739, 73 y 7.

Definir un procedimiento esPrimoMuyPrimo que compruebe si un número es primo y todoslos que se obtienen quitando sucesivamente la última cifra también lo son.

Ejercicio 61 Decimos que un número natural n es especial si el número de dígitos distintos de nes un dígito de n.

1. Definir un procedimiento esEspecial que determine si un número es o no especial.

esEspecial 34 => FalseesEspecial 24 => TrueesEspecial 11 => True

2. Definir un procedimiento listaEspecialesMenores, mediante recursión terminal, que dadoun número construya la lista con los números especiales menores que él.

Ejercicio 62 Definir una función sumaEspecial que dado un número natural sume sus cifras reite-radamente hasta obtener un número de una sola cifra. Por ejemplo:

sumaEspecial 697518904 = 4 (697518904 --> 49 --> 13 --> 4)

Ejercicio 63 Definir una función esProductoConsecutivos que dado un número natural determi-ne si es producto de dos números naturales consecutivos. Ejemplos

esProductoConsecutivos 6 => TrueesProductoConsecutivos 8 => FalseesProductoConsecutivos 20 => TrueesProductoConsecutivos 603 => False

Nota: definirla por recursión y mediante listas por comprensión y comprobar que ambasdefiniciones son equivalentes.

Page 20: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 64 Un número natural es equilibrado si la suma de los dígitos que ocupan lugares parescoincide con la suma de los dígitos que ocupan lugares impares. Ejemplos:

34 no es un número equilibrado

1232 y 132 sí lo son.

Definir una función esEquilibrado que determine si un número natural es equilibrado.

Ejercicio 65 Decimos que una lista es consecutiva si está formada por números naturales conse-cutivos sin repeticiones (en cualquier orden).

Definir un función esConsecutiva que determine si una lista es consecutiva. Ejemplos:

esConsecutiva [3, 4, 2, 5] => TrueesConsecutiva [3, 4, 2, 5, 6, 8, 7] => TrueesConsecutiva [3, 4, 2, 5, 7] => FalseesConsecutiva [3, 4, 2, 5, 2] => False

Ejercicio 66 Definir una función agrupa que reciba una lista, ls, devuelva una lista cuyos ele-mentos son pares de la forma (x . n), donde n es el número de veces que x ocurre en ls.

agrupa [a, e, a, r, s, a, a, a, s] => [(s,2), (r,1), (e,1), (a,5)]

Ejercicio 67 En el plano euclídeo, consideremos un círculo de radio r centrado en el origen decoordenadas.

Definir una función puntosEnCirculo que dado r devuelva una lista con los puntos de coor-denadas enteras interiores al círculo (incluida la circunferencia).

puntosEnCirculo 3 ==> [(-3,0), (-2,-2), (-2,-1), (-2,0), (-2,1), (-2,2),( -1,-2), (-1,-1), (-1,0), (-1,1), (-1,2), (0,-3),(0,-2), (0,-1), (0,0), (0,1), (0,2), (0,3), (1,-2),(1,-1), (1,0), (1,1), (1,2), (2,-2), (2,-1), (2,0),(2,1), (2,2), (3,0)]

Ejercicio 68 Definir una función esSimetrica que reciba una matriz cuadrada (representada co-mo un lista de listas que representan las filas de la matriz) y determine si la matriz es simétrica.

esSimetrica [[1,2], [2,1]] => TrueesSimetrica [[1,2,3],[2,4,5],[3,5,6]] => TrueesSimetrica [[1,8,3],[2,4,5],[3,5,6]] => False

Ejercicio 69 En un templo hindú se encuentran tres varillas de platino. En una de ellas, hay 64anillos de oro de distintos radios, colocados de mayor a menor.

El trabajo de los monjes de ese templo consiste en pasarlos todos a la tercera varilla, usandola segunda como varilla auxiliar, con las siguientes condiciones:

En cada paso sólo se puede mover un anillo.

Nunca puede haber un anillo de mayor diámetro encima de uno de menor diámetro.

La leyenda dice que cuando todos los anillos se encuentren en la tercera varilla, será el fin delmundo.

Definir la función numPasosHanoi que reciba el número de discos y devuelva el número depasos necesarios para trasladarlos. Por ejemplo,

Page 21: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 70 Definir la función aproxLimSeno que dado un número natural, n, mayor que 0, de-vuelva una lista cuyos elementos son los términos de la sucesión

{ sen(1/m)

1/m}1<=m<=n

Por ejemplo,

aproxLimSeno 1 ==> [0.8414709848078965]aproxLimSeno 3 ==> [0.8414709848078965, 0.958851077208406, 0.9815840903884566]aproxLimSeno 5 ==> [0.8414709848078965, 0.958851077208406, 0.9815840903884566,

0.9896158370180917, 0.9933466539753061]

Ejercicio 71 Definir la función aproxE que dado un número natural, n, mayor que 0, devuelvauna lista cuyos elementos son los términos de la sucesión

(1 +1m)m

para m desde 1 hasta n. Por ejemplo,

aproxE 1 ==> [2.0]aproxE 3 ==> [2.0,2.25,2.37037037037037]aproxE 5 ==> [2.0,2.25,2.37037037037037,2.44140625,2.4883199999999994]

Ejercicio 72 Definir la función restaACada que dados un número, x, y una lista numérica, xs,devuelva la lista en la que a cada elemento de xs se le ha restado x. Por ejemplo,

restaACada 2 [] => []restaACada 2 [3, 1, 5, 6] => [1,-1,3,4]restaACada 1.5 [0.5, 0, -0.5] => [-1.0,-1.5,-2.0]

Ejercicio 73 Definir la función listaNumero que dada una lista no vacía de dígitos devuelva elnúmero formado por dichos dígitos. Por ejemplo,

listaNumero [0] => 0listaNumero [1, 3, 4, 7] => 1347listaNumero [0, 0, 1] => 1

Ejercicio 74 Definir la función dentroDelIntervalo que reciba dos números x e y, el primeromenor o igual que el segundo, y una lista numérica zs, determine si todos los elementos de zsestán entre x e y. Por ejemplo,

dentroDelIntervalo 1 5 [] => TruedentroDelIntervalo 1 5 [3, 2, 4.5, 1.8] => TruedentroDelIntervalo 0.5 6 [-1, 7, 4] => False

Ejercicio 75 Definir la función estanEnElIntervalo que reciba dos números x e y, el primeromenor o igual que el segundo, y una lista numérica zs y devuelva la lista con los elementos de zsque están entre x e y. Por ejemplo,

Page 22: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

estanEnElIntervalo 1 5 [3,2,4.5,1.8] => [3.0,2.0,4.5,1.8]estanEnElIntervalo 1 5 [3,2,4,5,1,8] => [3,2,4,5,1]estanEnElIntervalo 0.5 6 [-1,7,4] => [4.0]estanEnElIntervalo 3 9 [1,2,17] => []

Ejercicio 76 Definir la función reagrupa que reciba una lista no vacía cuyos elementos sean listasde longitud 3 y actúe del siguiente modo:

reagrupa [[2,3,5]] => ([2],[3],[5])reagrupa [[2,3,5],[1,4,6]] => ([2,1],[3,4],[5,6])reagrupa [[2,3,5],[1,4,6],[7,8,9]] => ([2,1,7],[3,4,8],[5,6,9])

Ejercicio 77 Definir la función acumulada que reciba una lista numérica, no vacía, y devuelva lalista obtenida al sustituir en dicha lista cada uno de sus elementos por la suma de los elementosanteriores a él. Por ejemplo,

acumulada [1] => [1]acumulada [4,3,2,1] => [4,7,9,10]acumulada [2,4,5,10] => [2,6,11,21]

Ejercicio 78 Definir la función listaDivisores que dado un número natural devuelva la lista desus divisores (incluido el 1 y excluido el propio número), en orden creciente. Por ejemplo,

listaDivisores 6 => [1,2,3]listaDivisores 20 => [1,2,4,5,10]listaDivisores 16 => [1,2,4,8]

Ejercicio 79

1. Definir la función esPrefijo que reciba dadas cadenas determine si la primera es prefijo dela segunda. Por ejemplo,

esPrefijo "ei" "eiou" => TrueesPrefijo "ei" "aeiou" => False

2. Definir la función prefijosRestos que dada una cadena devuelva la lista de los pares for-mados por los prefijos de la cadena y los restos. Por ejemplo,

prefijosRestos "abc" ==> [("a","bc"),("ab","c"),("abc","")]

3. Definir un predicado prefijoRep que reciba dada una cadena determine si tiene repetido elcomienzo. Por ejemplo,

prefijoRep "aaeio" => TrueprefijoRep "aeeia" => False

4. Decimos que una cadena es buena si no contiene subcadenas consecutivas iguales. Definirun predicado esBuena que determine si una cadena es buena o no. Por ejemplo,

esBuena "aeiou" => TrueesBuena "aeieiu" => FalseesBuena "aeioeiu" => False

Page 23: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 80 Definir la función, usando recursión terminal,

multiplica :: (Int -> Bool) -> (Int -> Int) -> Int -> Int

tal que (multiplica p f n) es el producto de los elementos de la sucesión, f (k) : k = 0, ..., n, paralos que k satisfacen el predicado p. Por ejemplo,

multiplica even (^ 2) 5 => 0multiplica odd (^ 2) 5 => 225

Ejercicio 81 Definir la función

aCada :: (a -> Bool) -> (a -> a) -> [a] -> [a]

tal que (aCada p f xs) es la lista obtenida a partir de xs sustituyendo los elementos que satisfa-cen el predicado p por el valor obtenido al aplicarles f. Por ejemplo,

aCada even (+1) [1,2,3,4,5,6] => [1,3,3,5,5,7]

Dar 4 definiciones (recursiva, con listas de comprensión, con map y con foldr) y comprobar suequivalencia con QuickCheck.

Ejercicio 82 Definir la función

alMenos :: Int -> (a -> Bool) -> [a] -> Bool

tal que (alMenos n p xs) se verifica si al menos n elementos de la lista xs verifican el predicadop. Por ejemplo,

alMenos 0 even [] => TruealMenos 3 even [1,2,4,16,18] => TruealMenos 3 odd [1,2,4,16,18] => False

Ejercicio 83 Definir la función

sublistas :: [a] -> [[a]]

tal que (sublistas xs) es la lista de las sublistas de la lista xs. Por ejemplo,

sublistas [2,3,4] ==> [[], [4], [3], [3,4], [2], [2,4], [2,3], [2,3,4]]sublistas [1,2,3,4] ==> [[], [4], [3], [3,4], [2], [2,4], [2,3], [2,3,4],

[1], [1,4], [1,3], [1,3,4], [1,2], [1,2,4],[1,2,3], [1,2,3,4]]

Ejercicio 84 Definir la función

suma_menor :: => [Int] -> Int -> [[Int]]

tal que (sumaMenor xs n) es la lista de las sublistas de xs cuya suma es menor o igual que n. Porejemplo,

sumaMenor [1,7,2,4] 9 => [[],[4],[2],[2,4],[7],[7,2],[1],[1,4],[1,2],[1,2,4],[1,7]]sumaMenor [3,5,8,9,4] 2 => [[]]sumaMenor [2,3,1,7] 6 => [[],[1],[3],[3,1],[2],[2,1],[2,3],[2,3,1]]

Page 24: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 85 Definir la función

colas :: [a] -> [[a]]

tal que (colas xs) es la lista de las segmentos finales de la lista xs. Por ejemplo,

colas [] => [[]]colas [1,4] => [[1,4],[4],[]]colas [1,4,5,2,3] => [[1,4,5,2,3],[4,5,2,3],[5,2,3],[2,3],[3],[]]

Comprobar que colas es equivalente a la función tails definida en el módulo Data.Lists.

Ejercicio 86 Definir la función

cabezas :: [a] -> [[a]]

tal que (cabezas xs) es la lista de los segmentos iniciales de xs. Por ejemplo,

cabezas [] => [[]]cabezas [1,4] => [[1],[1,4]]cabezas [1,4,5,2,3] => [[1],[1,4],[1,4,5],[1,4,5,2],[1,4,5,2,3]]

Comprobar que cabezas es equivalente a la función inits definida en el módulo Data.Lists.

Ejercicio 87 Diremos que una matriz numérica n × n es un cuadrado mágico si cumple la si-guiente propiedad: las sumas de cada una de sus filas, columnas y dos diagonales principalescoinciden. Por ejemplo, 2 9 4

7 5 36 1 8

es un cuadrado mágico, ya que todas sus filas, columnas y diagonales principales suman 15.

Representaremos una matriz numérica como una lista cuyos elementos son las filas del cua-drado, en forma de listas. Por ejemplo, el cuadrado anterior se representa por la siguiente lista:

[[2, 9, 4], [7, 5, 3], [6, 1, 8]]

1. Definir la función

sumasDeFilas :: [[Int]] -> [Int]

tal que (sumasDeFilas xss) es la lista de las sumas de las filas de la matriz xss. Por ejemplo,

sumasDeFilas [[2,9,4],[7,4,3],[6,1,2]] => [15,14,9]

2. Definir la función

traspuesta :: [[a]] -> [[a]]

tal que (traspuesta xss) es la matriz traspuesta de xss. Por ejemplo,

traspuesta [[2,9,4],[7,4,3],[6,1,2]] => [[2,7,6],[9,4,1],[4,3,2]]

3. Definir la función

Page 25: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

sumasDeColumnas :: [[Int]] -> [Int]

tal que (sumasDeColumnas xss) es la lista de las sumas de las columnas de la matriz xss.Por ejemplo,

sumasDeColumnas [[2,3,4],[2,4,3],[3,1,2]] => [7,8,9]

4. Definir la función

diagonalPrincipal :: [[Int]] -> [Int]

tal que (diagonalPrincipal xss) es la diagonal principal de la matriz xss. Por ejemplo,

diagonalPrincipal [[2,9,4],[7,5,3],[6,1,8]] => [2,5,8]

5. Definir la función

diagonalSecundaria :: [[Int]] -> [Int]

tal que (diagonalSecundaria xss) es la diagonal secundaria de la matriz xss. Por ejemplo,

diagonalSecundaria [[2,9,4],[7,5,3],[6,1,8]] => [6,5,4]

6. Definir la función

todosIguales :: [Int] -> Bool

tal que (todosIguales xs) se verifica si todos los elementos de la lista xs son iguales. Porejemplo,

todosIguales [2,2,2] => TruetodosIguales [2,3,2] => False

7. Definir la función

cuadradoMagico :: [[Int]] -> Bool

tal que (cuadradoMagico xss) se verifica si la matriz cuadrada xss es un cuadrado mágico.Por ejemplo,

cuadradoMagico [[2,9,4],[7,5,3],[6,1,8]] => TruecuadradoMagico [[1,2,3],[4,5,6],[7,8,9]] => FalsecuadradoMagico [[1,4],[3, 4]] => False

Ejercicio 88 Definir la función

sumaPosicion :: [Int] -> Int

tal que (sumaPosicion xs) es la suma de cada uno de dichos números elevado a la posición queocupa (empezando a contar las posiciones por 1). Por ejemplo,

sumaPosicion [] => 0sumaPosicion [1,0,1,0,1,1] => 4sumaPosicion [2,3,0,1] => 12

Page 26: Informática de 1o de Matemáticas Listas por …...1. Definir la función extraetal que (extrae xs n)es la lista resultado de eliminar el elemento n-ésimo de la lista xs. Si nes

Ejercicio 89 Se dice que una sucesión x1, ..., xn está ordenada cíclicamente si existe un índice i talque la sucesión xi, xi+1, ..., xn, x1, ..., xi−1 está ordenada (en orden creciente). Definir la función

ordenadaCiclicamente :: [Int] -> Int

tal que (ordenadaCiclicamente xs) es el índice (empezando a contar los índices por 1) a partirdel cual está ordenada, si la lista está ordenada cíclicamente y 0 en caso contrario. Por ejemplo,

ordenadaCiclicamente [1,2,3,4] => 1ordenadaCiclicamente [4,6,7,5,4,3] => 0ordenadaCiclicamente [5,8,2,3] => 3

Ejercicio 90 Definir la función

sumaPred :: (Int -> Bool) -> [Int] -> Int

tal que (sumaPred p xs) es la suma de los cuadrados de los elementos de xs que cumplen elpredicado p más la suma de los restantes elementos de xs. Por ejemplo,

sumaPred odd [2,4,3,5] => 40sumaPred even [2,4,3,5] => 28

Ejercicio 91 Definir la función

grafo :: (a -> Bool) -> (a -> b) -> [a] -> [(a, b)]

tal que (grafo p f xs) es la lista formada por los pares cuyos primeros elementos son los ele-mentos de xs que satisfacen p y sus segundos elementos son los valores obtenidos al aplicar adichos elementos la función f. Por ejemplo,

grafo even (+1) [1,2,3,4,5] => [(2,3),(4,5)]

Ejercicio 92 Se considera el siguiente procedimiento:

patron :: ([b] -> t) -> (a -> b) -> [a] -> tpatron f g xs = f (map g xs)

Definir, usando patron, la función

longitud :: [a] -> Integer

tal que (longitud xs) es el número de elementos de xs. Por ejemplo,

longitud [2,1,4,4,4] => 5