Haskell - Parcial 2018-11-06 P24239


Statement
 

pdf   zip

html

1. Números romanos (con recursividad)

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.

2. Números romanos (sin recursividad)

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.

3. Raíces

La serie de Taylor para calcular √x es:

     
f1(x)=x          
fn(x)
=
1
2



fn−1(x)+
x
fn−1(x)



         

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.

4. Más raíces

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.

5. Escritura de árboles

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.

6. Creación de árboles equilibrados

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.

7. Mónadas y árboles

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.

Public test cases
  • 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
    
  • Information
    Author
    Jordi Petit, Albert Rubio, Gerard Escudero
    Language
    Spanish
    Translator
    Albert Rubio
    Original language
    Catalan
    Other languages
    Catalan
    Official solutions
    Haskell
    User solutions
    Haskell