Suma de todos los anteriores.
Enunciado
1 2 3 4 5 6 7 8 9 |
-- Definir la función -- sumaAnteriores :: [Integer] -> Bool -- tal que (sumaAnteriores xs) se verifica si cada elemento de la lista -- xs (excepto el primero) es la suma de sus anteriores elementos en la -- lista. Por ejemplo, -- sumaAnteriores [3,3,6,12] == True -- sumaAnteriores [3,3,7,10] == False -- sumaAnteriores [3] == True -- sumaAnteriores [] == True |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import Test.QuickCheck -- 1ª definición (por recursión): sumaAnteriores :: [Integer] -> Bool sumaAnteriores xs = aux (reverse xs) where aux [] = True aux [_] = True aux (x:xs) = x == sum xs && aux xs -- 2ª definición (por comprensión): sumaAnteriores2 :: [Integer] -> Bool sumaAnteriores2 (x:y:zs) = x == y && and [b == 2*a | (a,b) <- adyacentes (y:zs)] where adyacentes xs = zip xs (tail xs) sumaAnteriores2 _ = True -- La propiedad de equivalencia es prop_equiv_sumaAnteriores :: [Integer] -> Bool prop_equiv_sumaAnteriores xs = sumaAnteriores xs == sumaAnteriores2 xs |
*He quitado los paréntesis innecesarios de xs
En la segunda ecuación, en mejor sustituir [x] por [_], con una variable anónima
La definición se puede mejorar, pues en sumaAnteriores [x] = True podemos sustituir la x por la variable anónima: sumaAnteriores [_] = True