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

gstyhher  于 2022-12-08  发布在  Erlang
关注(0)|答案(3)|浏览(182)

我正在学习Erlang和其中一个问题,按照Joe的书中的状态
如果X是偶数,函数even(X)应返回true,否则返回false。如果X是奇数,函数odd(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>

我的问题是是否有更好的方法来做到这一点
谢谢

0g0grzrc

0g0grzrc1#

你可以使用guards来限制自己只能使用大于或等于零的整数,然后按照问题注解中的建议检查最低有效位。你也可以用even/1来定义odd/1

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

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

jv4diomz

jv4diomz2#

回答白日梦者关于史蒂夫回答的评论。
当你编写一个函数时,Erlang中的一个常见用法是只对“成功”的情况进行编码,而让crash对不成功的情况进行编码(我稍后会回来解释为什么这很重要)。
另一个对任何语言都有效的标准是,当有人使用或阅读您的代码时,避免出现意外。
在你的一条评论中,你说你想写的奇函数和偶函数被限制为正整数或空整数(我不会讨论这个选择,至少奇函数和偶函数被限制为整数),这意味着你必须问自己第一个问题:如果使用错误的参数调用函数,函数的行为是什么。

首选:让它崩溃这是史蒂夫的主张:这个函数只有在正确的参数下才能工作。2我总是喜欢这个解决方案。3唯一的例外是如果我不掌握输入参数,例如如果它们直接来自一个文件,一个用户界面...那么我更喜欢第三种选择。
第二选择:返回结果这是您选择:返回false。从逻辑的Angular 来看,对于奇函数和偶函数,返回false是有效的:is something is not true,it is false:o).我不喜欢这个解决方案有两个原因.第一个原因是,它不是一个可以很容易地推广到布尔答案以外的东西.第二个也是对我来说更重要的一个原因是,它可能会让用户感到惊讶.当函数odd(N)返回false时,认为N是偶数是合理的,而在这种情况下,odd(-2)和even(-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中更是如此。如果一个进程没有检测到(并且最简单的检测是崩溃)和错误并且通过消息传播一些无效信息,可能很难找到问题的根本原因,忽略发出这个消息的进程(可能是死的)。2只对成功的情况进行编码是一种尽快发现问题的简单方法。

9rbhqvlz

9rbhqvlz3#

Find the no if even 
%functions that manipulate functions are called higher-order %functions, and the data type that represents a function in Erlang is %called a fun. here in below example you see FUNCTIONS THAT HAVE %FUNCTIONS AS THEIR ARGUMENTS

% K is an example list
1> K=[4,5,6,8,10].  
[4,5,6,8,10]

% Use lisst:filter  to perform no/2  and filter if rem=0 
2> lists:filter(fun(J)->(J rem 2)=:=0 end, K).
[4,6,8,10]

Another way:

% Function to check even

22> Checkeven=fun(U)->(U rem 2)=:=0 end. 
#Fun<erl_eval.7.126501267>

23> Checkeven(5).
false

% Define a test list
25> K=[1,2,3,4,5].
[1,2,3,4,5]

% Use lists filter to apply Checkeven func to all elements of k

26> lists:filter(Checkeven,K). 

[2,4]

%Using List comprehension

42> K.
[1,2,3,4,5]

% For all elements of K check remainder of elem/2 is zero

43> [(S rem 2=:=0) || S<-K].
[false,true,false,true,false]

相关问题