Define una función roman2int :: String -> Int que convierta un número romano en su entero equivalente usando recursividad.
Recuerda que los números romanos se escriben con los símbolos I, V, X, L, C, D y M, con valores 1, 5, 10, 50, 100, 500 y 1000 respectivamente. En este sistema, para obtener el número representado, se suman los valores de los símbolos, excepto los símbolos situados a la izquierda de un símbolo de valor mayor, que se restan.
Define una función roman2int’ :: String -> Int que hace lo mismo que la función anterior pero sin usar recursividad: usa una o más funciones de orden superior.
La serie de Taylor para calcular √x es:
|
Define una función arrels :: Float -> [Float] que, dado un real x, retorna la lista infinita de los términos del desarrollo de Taylor de √x.
Escribe una función arrel :: Float -> Float -> Float que a partir de una x y un є, aproxime la raíz de x con un error inferior o igual a є utilizando la lista infinita anterior. El error en el término ti de la serie (con i>1) es la diferencia en valor absoluto entre ti y ti−1.
Considera el siguiente tipo genérico LTree a de árboles binarios con valores en las hojas:
data LTree a = Leaf a | Node (LTree a) (LTree a)
Haz que los árboles sean (“instance”) de la clase Show visualizándolos según los ejemplos.
Haz una función build :: [a] -> LTree a que, dada una lista no vacía, construye el LTree equilibrado (a la izquierda) que contiene los elementos de la lista en el mismo orden de izquierda a derecha. Decimos que un árbol está equilibrado a la izquierda si todos los subárboles tienen el hijo izquierdo con la misma profundidad que el hijo derecho o la misma más 1.
Define una función zipLTrees :: LTree a -> LTree b -> Maybe (LTree (a,b)) que combine los valores de las hojas de dos árboles con la misma estructura.
Si las estructuras de los dos árboles no encajan, retorna Nothing y, si encajan, retorna Just del árbol que tiene en cada hoja el par con el primer elemento del primer árbol y el segundo del segundo árbol en la misma posición.
Utiliza la notación do.
Input
roman2int "I" roman2int "IV" roman2int "MCCCXIX" roman2int "MMXVIII"
Output
1 4 1319 2018
Input
roman2int' "I" roman2int' "IV" roman2int' "MCCCXIX" roman2int' "MMXVIII"
Output
1 4 1319 2018
Input
take 10 $ arrels 4.0 take 10 $ arrels 100.0
Output
[4.0,2.5,2.05,2.0006099,2.0,2.0,2.0,2.0,2.0,2.0] [100.0,50.5,26.240099,15.02553,10.840435,10.032578,10.000053,10.0,10.0,10.0]
Input
arrel 4.0 0.00001 arrel 100.0 0.1
Output
2.0 10.000053
Input
Node (Leaf 3) (Node (Leaf 8) (Leaf 7)) Node (Leaf 1) (Node (Node (Leaf 3) (Leaf 4)) (Node (Leaf 8) (Leaf 7))) Node (Leaf "Albert") (Node (Leaf "Gerard") (Leaf "Jordi")) Leaf 'x'
Output
<{3},<{8},{7}>> <{1},<<{3},{4}>,<{8},{7}>>> <{"Albert"},<{"Gerard"},{"Jordi"}>> {'x'}
Input
build [3, 2, 5] build [3, 2, 8, 5, 1] build ['a', 'b', 'c', 'd'] build [[1, 2, 3]]
Output
<<{3},{2}>,{5}> <<<{3},{2}>,{8}>,<{5},{1}>> <<{'a'},{'b'}>,<{'c'},{'d'}>> {[1,2,3]}
Input
let t1 = Node (Leaf "a") (Node (Leaf "b") (Leaf "c")) let t2 = Node (Leaf 0) (Node (Leaf 1) (Leaf 2)) let t3 = Node (Node (Leaf 1) (Leaf 2)) (Leaf 0) zipLTrees t1 t2 zipLTrees t1 t3
Output
Just <{("a",0)},<{("b",1)},{("c",2)}>> Nothing