Sumable sin vecinos
En la lista [3,2,5,7,4] el número 12 se puede escribir como una suma de elementos de la lista sin incluir sus vecinos (ya que es la suma de 3, 5 y 4); en cambio, 14 no lo es (porque es la suma de 3, 7 y 4, pero 7 y 4 son vecinos).
Definir la función
1 |
esSumableSinVecinos :: [Int] -> Int -> Bool |
tal que (esSumableSinVecinos xs n) se verifica si n se puede escribir como una suma de elementos de xs que no incluye a ninguno de sus vecinos. Por ejemplo,
1 2 3 4 5 |
esSumableSinVecinos [3,2,5,7,4] 12 == True esSumableSinVecinos [3,2,5,7,4] 9 == True esSumableSinVecinos [3,2,5,7,4] 6 == True esSumableSinVecinos [3,2,5,7,4] 14 == False esSumableSinVecinos [3,2,5,7,4] 1 == False |
Soluciones
1 2 3 4 5 6 |
esSumableSinVecinos :: [Int] -> Int -> Bool esSumableSinVecinos _ 0 = True esSumableSinVecinos [] _ = False esSumableSinVecinos [x] n = x == n esSumableSinVecinos (x:y:zs) n = esSumableSinVecinos zs (n - x) || esSumableSinVecinos (y:zs) n |
Hola Antonio, ¿me podrías explicar como defines noVecinos?
¡¡Gracias!!
Falla en casos como el siguiente
Explícitamente no he considerado los negativos, pero si quieres considerarlos hay una reducción trivial con coste O(n) (y dado que el algoritmo es exponencial no importa mucho) de uno que admite sólo no negativos a otro que admite todos los enteros.
Una propuesta usando matrices:
Falla en el primer ejemplo
pero 12 = 3 + 5 + 4
Es verdad, es que no es un vector fila lo que se obtiene, si no un vector columna. Entonces la definición debería de ser: