Haskell — Parcial 2017-12-04

Problema 1: Expressió postfixa 1

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.

Problema 2: Expressió postfixa 2

Escriviu una funció eval2 :: String -> Int que avalui una expressió postfixa com al Problema 1, però sense utilitzar recursivitat.

Problema 3: fsmap

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ó.

Problema 4: Dividir i vèncer

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:

    divideNconquer :: (a -> Maybe b) -> (a -> (a, a)) -> (a -> (a, a) -> (b, b) -> b) -> a -> b

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.

Problema 5: Racionals

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 "xx/yy".

Seguiu aquesta interfície:

    data Racional = ...
    racional :: Integer -> Integer -> Racional
    numerador :: Racional -> Integer
    denominador :: Racional -> Integer

Si voleu, podeu utilitzar la funció estàndard gcd que retorna el màxim comú divisor de dos naturals.

Problema 6: Arbre de Calkin-Wilf

L’arbre de Calkin–Wilf és un arbre binari que representa tots els racionals positius. L’arbre té com arrel el racional 1/11/1 i, qualsevol node a/ba/b té dos fills a/(a+b)a/(a + b) i (a+b)/b(a + b)/b.

Aquests són els primers nivells de l’arbre de Calkin–Wilf: [figura extreta de Wikipedia]

image

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ó:

    data Tree a = Node a (Tree a) (Tree a)
    recXnivells :: Tree a -> [a]
    recXnivells t = recXnivells' [t]
        where recXnivells' ((Node x fe fd):ts) = x:recXnivells' (ts ++ [fe, fd])

Important

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!).

Informació del problema

Autoria: Jordi Petit

Generació: 2026-02-12T08:48:33.949Z

© Jutge.org, 2006–2026.
https://jutge.org