Sucesión de sumas de dígitos
Definir la lista
1 |
sucSumaDigitos :: [Integer] |
cuyos elementos son los términos de la sucesión a(n) definidos por a(0) = 1 y, para n ≥ 1, a(n) es la suma de los dígitos de todos los términos precedentes. Por ejemplo,
1 2 3 4 |
λ> take 20 sucSumaDigitos [1,1,2,4,8,16,23,28,38,49,62,70,77,91,101,103,107,115,122,127] λ> sucSumaDigitos !! 1000000 31054319 |
Soluciones
[schedule expon=’2016-06-09′ expat=»06:00″]
- Las soluciones se pueden escribir en los comentarios hasta el 09 de junio.
- El código se debe escribir entre una línea con <pre lang=»haskell»> y otra con </pre>
[/schedule]
[schedule on=’2016-06-09′ at=»06:00″]
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 |
-- 1ª definición -- ============= sucSumaDigitos1:: [Integer] sucSumaDigitos1 = 1 : iterate f 1 where f x = x + sum (digitos x) digitos:: Integer -> [Integer] digitos n = [read [x] | x <- show n] -- 2ª definición -- ============= sucSumaDigitos2:: [Integer] sucSumaDigitos2 = 1 : iterate f 1 where f x = x + sumaDigitos x sumaDigitos n | n < 10 = n | otherwise = sumaDigitos q + r where (q,r) = divMod n 10 -- Comparación de eficiencia -- ========================= -- λ> sucSumaDigitos1 !! 1000000 -- 31054319 -- (24.04 secs, 52,022,125,016 bytes) -- λ> sucSumaDigitos2 !! 1000000 -- 31054319 -- (10.86 secs, 5,267,144,472 bytes) |
[/schedule]
2 Comentarios