Prefijo con suma acotada
Definir la función
1 |
prefijoAcotado :: (Num a, Ord a) => a -> [a] -> [a] |
tal que (prefijoAcotado x ys) es el mayor prefijo de ys cuya suma es menor que x. Por ejemplo,
1 2 |
prefijoAcotado 10 [3,2,5,7] == [3,2] prefijoAcotado 10 [1..] == [1,2,3] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
-- 1ª definición (por recursión): prefijoAcotado :: (Num a, Ord a) => a -> [a] -> [a] prefijoAcotado x [] = [] prefijoAcotado x (y:ys) | y < x = y : prefijoAcotado (x-y) ys | otherwise = [] -- 2ª definición (con scanl1 y takeWhile): prefijoAcotado2 :: (Num a, Ord a) => a -> [a] -> [a] prefijoAcotado2 x ys = map fst conSumasAcotadas where sumas = scanl1 (+) ys conSumas = zip ys sumas conSumasAcotadas = takeWhile (\(a,b) -> b < x) conSumas -- 3ª definición (con (.)): prefijoAcotado3 :: (Num a, Ord a) => a -> [a] -> [a] prefijoAcotado3 x ys = map fst conSumasAcotadas where sumas = scanl1 (+) ys conSumas = zip ys sumas conSumasAcotadas = takeWhile ((<x) . snd) conSumas -- 4ª definición: prefijoAcotado4 :: (Num a, Ord a) => a -> [a] -> [a] prefijoAcotado4 x ys = map fst (takeWhile ((<x) . snd) (zip ys (scanl1 (+) ys))) |
Sólo para listas finitas