Erlang编程实践启示

近日,在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中。当然这里也不是说在函数中就不能用这些复杂的语句。既然简单的语句能处理好,何必写这么复杂的语句呢?

再看第二个程序,就是充分利用了函数参数中的匹配功能,从而达到简化函数内部语句的复杂性,从而使程序更易懂、易读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值