Persistencia aditiva
La raíz digital de un número entero positivo n es el dígito resulta al sumar sus dígitos, volviendo a sumar reiteradamente los resultados de esa suma y de las siguientes hasta que la suma sea un número de un dígito, al que se llama la raíz digital del número n y se representa pod D(n). Por ejemplo, la raíz digital del número 23451 es 6, porque 2+3+4+5+1 = 15 y sumando los dígitos del 15 resulta 6.
La persistencia aditiva de un número entero positivo es el número de veces que hay sumar sus dígitos para llegar a su raíz digital. Por ejemplo, la persistencia aditiva de 2718 es 2: primero encontramos que 2+7+1+8 = 18, luego que 1+8 = 9.
Definir la función
1 |
persistencia :: Integer -> Integer |
tal que (persistencia n) es la persistencia del número entero positivo n. Por ejemplo,
1 2 3 |
persistencia 2718 == 2 persistencia 199 == 3 persistencia 19999999999999999999999 == 4 |
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import Data.List (genericLength) import Test.QuickCheck (Property, (==>), quickCheck) -- 1ª solución -- =========== persistencia :: Integer -> Integer persistencia n | n < 10 = 0 | otherwise = 1 + persistencia (sumaDigitos n) -- (sumaDigitos n) es la suma de los dígitos de n. Por ejemplo, -- sumaDigitos 2021 == 5 sumaDigitos :: Integer -> Integer sumaDigitos = sum . digitos -- (digitos n) es la lista de los dígitos de n. Por ejemplo, -- digitos 2021 == [2,0,2,1] digitos :: Integer -> [Integer] digitos x = [read [c] | c <- show x] -- 2ª solución -- =========== persistencia2 :: Integer -> Integer persistencia2 = aux 0 where aux m n | n < 10 = m | otherwise = aux (m+1) (sumaDigitos n) -- 3ª solución -- =========== persistencia3 :: Integer -> Integer persistencia3 n = genericLength (takeWhile (>9) (iterate sumaDigitos n)) -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_equiv :: Integer -> Property prop_equiv n = n > 0 ==> all (== (persistencia n)) [persistencia2 n, persistencia3 n] -- La comprobación es -- λ> quickCheck prop_equiv -- +++ OK, passed 100 tests. |
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>