Escriviu una funció eval1 :: String -> Int que avalui una expressió postfixa que es troba en una string. Els elements en l’expressió són valors (nombres naturals) i els operadors de suma, resta, producte i divisió. Els elements es separen per espais. Per exemple, l’avaluació de "15 1 2 + 24 * + 3 -" és 84.
La solució canònica per evaluar expressions postfixes és utilitzar una pila: Començant per una pila buida, es processen els elements de l’expressió d’esquerra a dreta. Si l’element és un valor, s’empila. Si l’element és un operador, es desempilen dos valors, s’operen d’acord amb l’operador i s’empila el resultat. Al final, la pila conté un sol element, que és el resultat de l’evalaució de l’expressió.
Podeu suposar que no hi ha mai errors a l’expressió ni divisions per zero.
Solucioneu el problema recursivament. La funció words us pot ser útil.
Escriviu una funció eval2 :: String -> Int que avalui una expressió postfixa com al Problema 1, però sense utilitzar recursivitat.
Definiu una funció fsmap :: a -> [a -> a] -> a que, donats un element x de tipus a i una llista fs de funcions de tipus a -> a, fa que fsmap x fs retorni l’aplicació (d’esquerra a dreta) de totes les funcions de fs a x. Es valorà com de succinta és la vostra solució.
Escriviu una funció d’ordre superior que definixi l’esquema de dividir i vèncer i utilitzeu-la per fer l’algorisme de quicksort per a llistes d’enters.
La funció per dividir i vèncer ha de tenir aquesta interfície:
on a és el tipus del problema, b és el tipus de la solució, i divideNconquer base divide conquer x utilitza:
La funció pel quicksort ha de ser quickSort :: [Int] -> [Int] i ha d’utilitzar divideNconquer.
Definiu un tipus Racional per manipular nombres racionals positius amb operacions per:
construir un racional a través d’un numerador i d’un denominador naturals, obtenir el numerador de la seva forma simplificada, obtenir el denominador de la seva forma simplificada.
A més, feu que Racional pertanyi a la classe Eq i a la classe Show, fent que els racionals es mostrin de la forma "x/y".
Seguiu aquesta interfície:
Si voleu, podeu utilitzar la funció estàndard gcd que retorna el màxim comú divisor de dos naturals.
L’arbre de Calkin–Wilf és un arbre binari que representa tots els racionals positius. L’arbre té com arrel el racional 1/1 i, qualsevol node a/b té dos fills a/(a + b) i (a + b)/b.
Aquests són els primers nivells de l’arbre de Calkin–Wilf: [figura extreta de Wikipedia]
Escriviu una funció racionals :: [Racional] que retorni la llista infinita de tots els nombres racionals positius segons l’ordre de l’arbre de Calkin–Wilf.
Per a fer-ho, utilitzeu el tipus Racional del problema anterior. També podeu aprofitar les definicions genèriques d’arbre infinit i del seu recorregut per nivells que es donen a continuació:
El problema té diferents apartats. Cada apartat val 2 punts sobre 10 (però el Jutge en suma 12). Heu de resoldre 5 dels 6 apartats (no els 6!).
Input
eval1 "15 1 2 + 24 * + 3 -" eval1 "66" eval1 "6 2 -" eval1 "7 2 /" eval1 "3 4 + 2 /"
Output
84 66 4 3 3
Input
eval2 "15 1 2 + 24 * + 3 -" eval2 "66" eval2 "6 2 -" eval2 "7 2 /" eval2 "3 4 + 2 /"
Output
84 66 4 3 3
Input
fsmap 3 [(+2), (*3), (+4)] fsmap "o" [(++"la"), (:)'h', (++"!")] fsmap False []
Output
19 "hola!" False
Input
quickSort [5, 3, 2, 3, 4, 1]
Output
[1,2,3,3,4,5]
Input
numerador (racional 1 2) denominador (racional 1 2) numerador (racional 2 4) denominador (racional 2 4) racional 1 2 racional 2 4 racional 1 2 == racional 2 4 racional 1 2 == racional 1 3
Output
1 2 1 2 1/2 1/2 True False
Input
take 10 racionals
Output
[1/1,1/2,2/1,1/3,3/2,2/3,3/1,1/4,4/3,3/5]