Función suma en Haskell

publicado por: Anonymous

El programa tiene que leer un número que se considera lista, pero solo da bien el resultado con dos cifras, con más de dos cifras el resultado es incorrecto ¿Cómo se puede corregir este código?

sumDigitos :: [Int] -> Int
sumDigitos [] = 0
sumDigitos [x] = x `div` 10 + x `mod` 10
sumDigitos (x:xs) = sumDigitos [x] + sumDigitos xs

Ejemplo de entrada

[1234]

Salida:

10

solución

La suma de los dígitos de un número n se define recursivamente como el último dígito del número (el resto de n módulo 10) más la suma del resto de dígitos (la llamada recursiva de n dividido entre 10):

sumDigitos' :: Int -> Int
sumDigitos' 0 = 0
sumDigitos' n = n `mod` 10 + sumDigitos' (n `div` 10)

Por ejemplo:

ghci> sumDigitos' 1234
10

Ahora, para sumar los dígitos de una lista de números simplemente hay que sumar la suma de los dígitos de cada número:

sumDigitos :: [Int] -> Int
sumDigitos [] = 0
sumDigitos (x:xs) = sumDigitos' x + sumDigitos xs

Por ejemplo:

ghci> sumDigitos [123,456,789]
45

También podrías definir sumDigitos directamente en estilo libre de puntos mediante las funciones map y sum:

sumDigitos :: [Int] -> Int
sumDigitos = sum . (map sumDigitos')
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *