Конечно, 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)