Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
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
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
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,
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
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
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.
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
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
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
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,
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
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
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]
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).
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
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
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.
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]]
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.
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,
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,
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
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]]
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
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
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