Ordenación de los racionales
En este ejercicio, representamos las fracciones mediante pares de números de enteros.
Definir la función
fraccionesOrd :: Integer -> [(Integer,Integer)]
tal que (fraccionesOrd n) es la lista con las fracciones propias positivas ordenadas, con denominador menor o igual que n. Por ejemplo,
λ> fraccionesOrd 4 [(1,4),(1,3),(1,2),(2,3),(3,4)] λ> fraccionesOrd 5 [(1,5),(1,4),(1,3),(2,5),(1,2),(3,5),(2,3),(3,4),(4,5)]
Soluciones
import Data.List (sort,sortBy) -- 1ª solución fraccionesOrd1 :: Integer -> [(Integer,Integer)] fraccionesOrd1 n = [(x,y) | (z,(x,y)) <- sort [(fromIntegral x/fromIntegral y,(x,y)) | y <- [2..n], x <- [1..y-1], gcd x y == 1]] -- 2ª solución fraccionesOrd2 :: Integer -> [(Integer,Integer)] fraccionesOrd2 n = map snd (sort [(fromIntegral x/fromIntegral y,(x,y)) | y <- [2..n], x <- [1..y-1], gcd x y == 1]) -- 3ª solución fraccionesOrd3 :: Integer -> [(Integer,Integer)] fraccionesOrd3 n = sortBy comp [(x,y) | y <- [2..n], x <- [1..y-1], gcd x y == 1] where comp (a,b) (c,d) = compare (a*d) (b*c)