Refinamiento de listas
Definir la función
1 |
refinada :: [Float] -> [Float] |
tal que (refinada xs) es la lista obtenida intercalando entre cada dos elementos consecutivos de xs su media aritmética. Por ejemplo,
1 2 3 |
refinada [2,7,1,8] == [2.0,4.5,7.0,4.0,1.0,4.5,8.0] refinada [2] == [2.0] refinada [] == [] |
Soluciones
1 2 3 4 5 6 7 8 9 |
-- 1ª definición (por recursión): refinada :: [Float] -> [Float] refinada (x:y:zs) = x : (x+y)/2 : refinada (y:zs) refinada xs = xs -- 2ª definición (por comprensión); refinada2 :: [Float] -> [Float] refinada2 [] = [] refinada2 (x:xs) = x : concat [[(a+b)/2,b] | (a,b) <- zip (x:xs) xs] |
La solución sencilla, por recursividad:
Otra solución usando
concatMap
yzip
: