Я изучаю Erlang и делаю упражнения из книги, поэтому я застрял на одном из них. Будет лучше, если я процитирую всю задачу, а затем объясню, что я сделал до сих пор: «Положительное число считается счастливым, если при повторном применении приведенной ниже процедуры достигается число 1. 1. Возведите в квадрат каждую цифру числа. 2. Вычислите сумму всех квадратов. Например, если вы начинаете с 19:
1 * 1 + 9 * 9 = 1 + 81 = 82
8 * 8 + 2 * 2 = 64 + 4 = 68
6 * 6 + 8 * 8 = 36 + 64 = 100
1 * 1 + 0 * 0 + 0 * 0 = 1 + 0 + 0 = 1
(т. е. 19 — счастливое число) Как узнать, что число несчастливое? На самом деле, каждое несчастливое число в конце концов достигнет цикла 4, 16, 37, 58, 89, 145, 42, 20, 4, … таким образом, достаточно найти любое число в этом цикле (скажем, 4) и сделать вывод, что исходный номер несчастлив. Напишите функции happy/1 и all_happy/2, которые возвращают, является ли число счастливым или нет (истинным или ложным), и все счастливые числа между N и M соответственно. (Подсказка: используйте функции оцифровки и суммирования). Примеры:
happy(28) → true
happy(15) → false
happy(5, 25) → [7, 10, 13, 19, 23]"
Итак, я создал дигитайзер/1, который при положительном числе N возвращает список цифр этого числа:
digitize(N) -> digitize1(N, []).
digitize1(N, Acc) when N > 0 -> digitize1(N div 10, [N rem 10| Acc]);
digitize1(N, Acc) when N == 0 -> Acc.
и сумма/1:
sum(N) when N > 0 -> N + sum(N-1);
sum(0) -> 0.
Итак, для счастливых чисел я сделал следующее:
happy(N) -> happy1(digitize(N), []).
happy1([], Acc) -> (Acc);
happy1([Head|Tail], Acc1) -> happy1(Tail, [Head * Head|Acc1]).
Он возводит элементы списка в квадрат, но я не могу придумать, как суммировать их и делать это снова рекурсивно, пока не достигнет 1 или 4. Любая помощь или идеи? А для второй части (all_happy/2), по моему некомпетентному мнению, я должен использовать понимание списка, но опять же, я не совсем уверен, как это реализовать. Спасибо за ваше время.