我正在学习一些 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 之间的所有快乐数字。(提示:使用函数 digitize 和 sum)。例子:
happy(28) → true
happy(15) → false
happy(5, 25) → [7, 10, 13, 19, 23]"
因此,我创建了一个 digitizer/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),在我不称职的意见中,我应该使用列表理解,但同样,我不太确定如何实现它。谢谢你的时间。