Definiu una funció roman2int :: String -> Int que converteixi un número romà al seu enter equivalent tot usant recursivitat.
Recordeu que els números romans s’escriuen amb els símbols I, V, X, L, C, D i M, amb valors 1, 5, 10, 50, 100, 500 i 1000 respectivament. En aquest sistema, per obtenir el nombre representat, se sumen els valors dels símbols, excepte els símbols situats a l’esquerra d’un símbol de valor més gran, que es resten.
Definiu una funció roman2int’ :: String -> Int que faci el mateix que la funció anterior però sense usar recursivitat: useu una o més funcions d’ordre superior.
La sèrie de Taylor per calcular √x és:
|
Definiu una funció arrels :: Float -> [Float] que, donat un real x, retorni la llista infinita dels termes del desenvolupament de Taylor de √x.
Escriviu una funció arrel :: Float -> Float -> Float que a partir d’una x i un є, aproximi l’arrel de x amb un error inferior o igual a є utilitzant la llista infinita anterior. L’error en el terme ti de la sèrie (amb i>1) és la diferència en valor absolut entre ti i ti−1.
Considereu el següent tipus genèric LTree a d’arbres binaris amb valors a les fulles:
data LTree a = Leaf a | Node (LTree a) (LTree a)
Feu que els arbres siguin instàncies de la classe Show visualitzant-se segons els exemples.
Feu una funció build :: [a] -> LTree a que, donada una llista no buida, construeix el LTree equilibrat (a l’esquerra) que conté els elements de la llista en el mateix ordre d’esquerra a dreta. Diem que un arbre es equilibrat a l’esquerra si tots els subarbres tenen el fill esquerre amb la mateixa profunditat que el fill dret o la mateixa més 1.
Definiu una funció zipLTrees :: LTree a -> LTree b -> Maybe (LTree (a,b)) que combini els valors de les fulles de dos arbres amb la mateixa estructura.
Si les estructures dels dos arbres no encaixen, retorna Nothing i, si encaixen, retorna Just de l’arbre que té a cada fulla el parell amb el primer element del primer arbre i el segon del segon arbre en la mateixa posició.
Utilitzeu la notació 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