Erlang 查找整数是偶数还是奇数

Erlang 查找整数是偶数还是奇数,erlang,Erlang,我正在学习Erlang,其中一个问题是根据Joe的书中陈述的 如果X是偶数整数,则函数偶数(X)应返回true,并且 否则就错了。如果X是奇数整数,则奇数(X)应返回true 我解决这个问题的方法是 -module(math_functions). %% API -export([even/1, odd/1]). even(Integer) -> (Integer >= 0) and (Integer rem 2 =:= 0). odd(Integer) -> (Integ

我正在学习
Erlang
,其中一个问题是根据
Joe
的书中陈述的

如果X是偶数整数,则函数偶数(X)应返回true,并且 否则就错了。如果X是奇数整数,则奇数(X)应返回true

我解决这个问题的方法是

-module(math_functions).

%% API
-export([even/1, odd/1]).

even(Integer) -> (Integer >= 0) and (Integer rem 2 =:= 0).
odd(Integer) -> (Integer >= 1) and (Integer rem 2 =/= 0).
并将此作为

Eshell V6.2  (abort with ^G)
1> math_functions:odd(13).
true
2> math_functions:odd(-13).
false
3> math_functions:odd(1).
true
4> math_functions:even(1).
false
5> math_functions:even(2).
true
6> math_functions:even(-2).
false
7>   
我的问题是,是否有更好的方法来做到这一点


谢谢

您可以使用保护将自己限制为大于或等于零的整数,然后只需按照问题注释中的建议检查最低有效位。您还可以根据
偶数/1
定义
奇数/1

even(X) when X >= 0 -> (X band 1) == 0.
odd(X) when X > 0 -> not even(X).

保护是函数头的一部分,因此如果调用
偶数(-1)
,它将无法以与调用
偶数(1,2)
完全相同的方式进行匹配(即参数数量错误)。

您可以使用保护将自己限制为大于或等于零的整数,然后简单地检查你的问题评论中建议的最低有效位。您还可以根据
偶数/1
定义
奇数/1

even(X) when X >= 0 -> (X band 1) == 0.
odd(X) when X > 0 -> not even(X).

防护装置是函数头的一部分,因此如果调用
偶数(-1)
,它将无法以与调用
偶数(1,2)
(即参数数目错误)完全相同的方式匹配。

回答Daydreamer关于Steve Answer的评论

在编写函数时,erlang中的一个常见用法是只编写“成功”案例,让失败案例崩溃(我稍后会回来解释为什么它很重要)

另一个对任何语言都有效的标准是,当有人使用或阅读您的代码时,要避免惊讶

在你的一条评论中,你说你想写的奇偶函数被限制为正整数或空整数(我不会讨论这个选择,至少奇偶函数被限制为整数)。这意味着您必须先问自己一个问题:如果使用错误的参数调用我的函数,它的行为会是什么

第一选择:让它崩溃这是Steve的命题:函数只能在正确的参数下工作。我总是喜欢这个解决方案。唯一的例外是,如果我不掌握输入参数,例如,如果它们直接来自文件、用户界面。。。那么我更喜欢第三种选择

第二选择:返回结果这是您的选择:返回false。从逻辑的角度来看,对于奇偶函数,返回false是有效的:如果某物不是真的,那么它就是false:o)。我不喜欢这个解决方案有两个原因。第一个是,它不是一个你可以很容易地推广到布尔答案以外的东西。第二个也是对我来说更重要的一点是,它可能会让用户感到惊讶。当函数奇数(N)返回false时,有理由认为N是偶数,而在这种情况下,奇数(-2)和偶数(-2)都将返回false

第三种选择:返回带标记的结果这是您在erlang中经常看到的情况:函数返回{ok,Value}或{Error,Term}。这样做可以让调用函数选择是否管理错误参数。Error变量允许您显示错误消息,这对调试和用户界面都很有用。在您的示例中,代码变成:

even(X) when is_integer(X), X >= 0 -> {ok,(X band 1) == 0};
even(X) -> {illegal_param,X}.
odd(X) when is_integer(X), X >= 0 -> {ok,(X band 1) == 1};
odd(X) -> {illegal_param,X}.

在编程时,尽快检测错误非常重要,在erlang中更为重要。如果一个进程没有检测到(最简单的检测是崩溃)和错误,并通过消息传播一些无效信息,则很难找到问题的根本原因,忽略发出此消息的进程(可能已死亡)。只编写成功案例是尽快发现问题的简单方法。

回答Daydreamer关于Steve Answer的评论

在编写函数时,erlang中的一个常见用法是只编写“成功”案例,让失败案例崩溃(我稍后会回来解释为什么它很重要)

另一个对任何语言都有效的标准是,当有人使用或阅读您的代码时,要避免惊讶

在你的一条评论中,你说你想写的奇偶函数被限制为正整数或空整数(我不会讨论这个选择,至少奇偶函数被限制为整数)。这意味着您必须先问自己一个问题:如果使用错误的参数调用我的函数,它的行为会是什么

第一选择:让它崩溃这是Steve的命题:函数只能在正确的参数下工作。我总是喜欢这个解决方案。唯一的例外是,如果我不掌握输入参数,例如,如果它们直接来自文件、用户界面。。。那么我更喜欢第三种选择

第二选择:返回结果这是您的选择:返回false。从逻辑的角度来看,对于奇偶函数,返回false是有效的:如果某物不是真的,那么它就是false:o)。我不喜欢这个解决方案有两个原因。第一个是,它不是一个你可以很容易地推广到布尔答案以外的东西。第二个也是对我来说更重要的一点是,它可能会让用户感到惊讶。当函数奇数(N)返回false时,有理由认为N是偶数,而在这种情况下,奇数(-2)和偶数(-2)都将返回false

第三种选择:返回带标记的结果这是您在erlang中经常看到的情况:函数返回{ok,Value}或{Error,Term}。这样做可以让调用函数选择是否管理错误参数。Error变量允许您显示错误消息,这对调试和用户界面都很有用。在您的示例中,代码变成:

even(X) when is_integer(X), X >= 0 -> {ok,(X band 1) == 0};
even(X) -> {illegal_param,X}.
odd(X) when is_integer(X), X >= 0 -> {ok,(X band 1) == 1};
odd(X) -> {illegal_param,X}.
在编程时,尽快检测错误非常重要,在erlang中更为重要。如果一个进程未检测到(和simp