【发布时间】:2013-09-24 22:56:49
【问题描述】:
我正在学习一些 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 是一个快乐的数字) 你怎么知道一个号码什么时候不开心?其实每一个不开心 number 最终会达到循环 4, 16, 37, 58, 89, 145, 42, 20, 4, …因此,在该循环中查找任何数字(例如 4)就足够了,并且 得出结论,原来的数字是不开心的。 编写函数happy/1和all_happy/2,返回 一个数字是否快乐(真或假)以及所有快乐的数字 分别在 N 和 M 之间。 (提示:使用函数 digitize 和 和)。 例子:
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.
和 sum/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),在我不称职的意见中,我应该使用列表理解,但同样,我不太确定如何实现它。感谢您的宝贵时间。
【问题讨论】:
-
这个练习很酷:)我不知道你是否知道Euler项目......如果没有,你会发现许多其他类似的小练习来训练erlang(或任何语言)。跨度>
标签: list recursion erlang list-comprehension tail-recursion