Конечно, div
и mod
быстрее, но почему бы и нет? Я предполагаю, что проблема заключается в преобразовании числа в список цифр:
toDigits = map (read . (:[])) . show
56518
преобразуется в строку "56518"
, и каждый символ в строке (каждая цифра) преобразуется в саму строку с map (:[])
, на данный момент у нас есть ["5","6","5","1","8"]
, и мы читаем каждую строку из одной цифры как целочисленное значение: [5,6,5,1,8]
. Сделанный.
Теперь мы можем вычислить сумму цифр следующим образом:
sumDigits x = sum (zipWith (*) (cycle [1,-1]) (reverse (toDigits x)))
cycle [1,-1]
образует бесконечный список [1, -1, 1, -1, ...]
, который мы соединяем с перевернутым списком цифр (toDigit x
) и умножаем элементы каждой пары. Итак, у нас есть [8, -1, 5, -6, 5]
и его сумма.
Теперь мы можем сделать это рекурсивно:
isDivisible x
| x == 11 || x == 0 = True
| x < 11 = False
| x > 11 = isDivisible (sumDigits x)
person
sastanin
schedule
22.10.2010
.
используется как разделитель тысяч (и,
для десятичной точки), поэтому он, вероятно, имел в виду56518
. - person sepp2k   schedule 21.10.2010