近日,在QQ聊天中看到一个做Erlang编程练习题,大致就是判断一个列表是否在另一个列表中出现。
实际上,我虽然学习Erlang有段时间,但没有真正去编写过软件或做大量编程。最初我写了这样一段程序来实现这个功能:
-module(test).
-export([forteen/2]).
forteen(A,B)->fun_sec(A,B,A,B0).
fun_sec(_,[],_,_,_)->false;
fun_sec([Ha|Ta],[Hb|Tb],A,B,Sum) when Ha==Hb ->
if
length(Ta)==0 ->[true,Sum];
true ->fun_sec(Ta,Tb,A,B,Sum)
end;
fun_sec(_,_,A,B,Sum)->
fun_sec(A,myy(Sum+1,B),A,B,Sum+1).
myy(_,[])->[];
myy(Sum,[_|T]) when Sum /=0 ->myy(Sum-1,T);
myy(0,B)->B.
但总觉得不够Erlangic,于是再另行编写,最后结果如下:
-module(test).
-export([forteen/2]).
forteen(A,B)->fun_sec(A,B,[],0).
fun_sec([],_,_,Sum) -> [true,Sum];
fun_sec(A,B,_,_) when length(A)>length(B) -> false;
fun_sec([H|Ta],[H|Tb],Samelst,Sum) ->
fun_sec(Ta,Tb,[H|Samelst],Sum);
fun_sec(A,[_|T],[],Sum)->fun_sec(A,T,[],Sum+1);
fun_sec(A,B,Samelst,Sum)->
[_|T]= myy(Samelst,B),
fun_sec(myy(Samelst,A),T,[],Sum+1).
myy([],Res) -> Res;
myy([H|T],Res) -> myy(T,[H|Res]).
姑且不谈程序的正确性如何,我觉得在编写Erlang程序时,还是与其它语言有较大的思维差别的。我觉得一般来说,其它语言很容易将功能处理单元写的很大,因为所有的处理都会在其中完成,写着写着就会大的不可收拾。记得看过一个公开课视频中一位JAVA老师说过,一个功能单元一般不应超过15个语句,再多的话,就要考虑分为另一个功能单元来完成。第一个程序,很显然有在功能单元中完成一切的倾向,所以并没有Erlangic,没有充分利用Erlang的匹配功能,而是将其放到when或if中。当然这里也不是说在函数中就不能用这些复杂的语句。既然简单的语句能处理好,何必写这么复杂的语句呢?
再看第二个程序,就是充分利用了函数参数中的匹配功能,从而达到简化函数内部语句的复杂性,从而使程序更易懂、易读。