Programación Funcional - Problema de examen haskell

   
Vista:

Problema de examen haskell

Publicado por Nidael (1 intervención) el 14/06/2009 16:57:14
buenos, me ponen mal este ejercicio en un examen de programacion haskell y por mas que le doy vueltas no veo en que esta mal, si alguien ve el fallo q me lo diga por favor, tengo la revision en 3 dias, gracias
el problema consiste en ordenar una matriz de por filas de menos a mayor.
ej: [[25,13,48],[7,15,14],[54,25,2]]
solucion seria: [[13,25,48],[7,15,14],[2,25,54]

programa en haskell que hice yo y segun el profesor esta mal

OrdenaMatriz :: [[Int]] -> [[Int]]
OrdenaMatriz ([ ]) = [ ] -- caso base
OrdenaMatriz ( C:R ) = OrdenaFila ( C ) : OrdenaMatriz (R)

OrdenaFila :: [Int] -> [Int]
OrdenaFila ([ ]) = [ ]
OrdenaFila (C1:(C2:R)) = IF ( C1<C2 ) Then C1: OrdenaFila (C2:R)
Else C2: OrdenaFila (C1:R)



PD- el programa le hice en un examen escrito a papel, puede a ver algun minimo fallo de escrituro q no compilase bien, pero no entiendo pq de 3 puntos q vale el ejercico me ha puesto solo 0,5 tengo un 4 en el examen y espero q si alguien ve el fallo o si ve q no hay fallos me pueda ayudar y en la revision pueda defenderlo y aprobar, muxas gracias. saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema de examen haskell

Publicado por Nidoyyo (1 intervención) el 28/01/2010 13:23:40
Bueno lo primero de todo es porque la sintaxis esta muy mal, aunque espero que en el examen lo hayas escrito bien.
No estas ordenando nada con esas funciones... Hubieses escogido otra manera de hacerlo.

Imaginate la siguiente lista : [1] (matriz unidimensional)
Con ordenaFila [1] te daria Exception en el prompt, ya que no incluyes el caso en el que tenga solo un elemento. Ademas ordenaFila no hace nada sino que cambia las posiciones de la matriz y ya esta
imaginate que tengas [4,5,1]
1--- ordenaFila (4:(5:[1])) = (if (4<5) then) 4:ordenafila(5:[1]) <<<<< (el 4 por delante)
2--- ordenaFila (5:(1:[])) = (else) 1:ordenaFila(5:[]) <<<<<<<<<<<<<(el 1 por delante)
3--- ordenaFila([1]) <- Exception
Aun asi si estuviese contemplado el otro caso base que falta:
ordenaFila [x] = [x]
Tendrias que la lista resultante es [4,1,5] y no esta ordenada.

En el proximo examen lo haras mejor

Una solucion:

{- Incluso se podria hacer generico y asi ganar mas puntos -}
ordenaMatriz :: [[Int]] -> [[Int]]
ordenaLista :: [Int] -> [Int]
insertaOrd :: Int -> [Int] -> [Int]

ordenaMatriz [] = [] -- Caso Base
ordenaMatriz (xs:xss) = (ordenaLista xs):ordenaMatriz xss

ordenaLista [] = [] -- Caso Base
ordenaLista (x:xs) = insertaOrd x (ordenaLista xs)

insertaOrd x [] = [x] -- Caso Base
insertaOrd x (y:ys)
| x<=y = x:y:ys
| otherwise = y:insertaOrd x ys

Podrias incluso hacerlo con un quicksort o con mergesort, pero son listas muy pequeñas que no exigen un rendimiento y eficiencia mejor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar