Reconocimiento de anterior
Definir la función
1 |
esAnterior :: Eq a => [a] -> a -> a -> Bool |
tal que (esAnterior xs y z) se verifica si y ocurre en xs antes que z (que puede no pertenecer a xs). Por ejemplo,
1 2 3 4 |
esAnterior [1,3,7,2] 3 2 == True esAnterior [1,3,7,2] 3 1 == False esAnterior [1,3,7,2] 3 5 == True esAnterior [1,3,7,2] 5 3 == False |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- 1ª definición (por recursión) esAnterior1 :: Eq a => [a] -> a -> a -> Bool esAnterior1 [] _ _ = False esAnterior1 (x:xs) y z = x /= z && (x == y || esAnterior1 xs y z) -- 2ª definición esAnterior2 :: Eq a => [a] -> a -> a -> Bool esAnterior2 xs y z = z `notElem` (takeWhile (/=y) xs) -- Comparación de eficiencia -- λ> let n = 1000000 in esAnterior1 [1..n] (n-1) n -- True -- (2.19 secs, 384,717,008 bytes) -- λ> let n = 1000000 in esAnterior2 [1..n] (n-1) n -- True -- (0.34 secs, 135,479,936 bytes) |
Esta definición no es del todo correcta. Debería ser: