分类 Erlang 下的文章

erlang语言

想着把node.js也搬上博客了,就再装逼一点来点erlang吧。
“whisper”中国版-“耳语”公司的后端语言是erlang。我与“耳语”的联系其实也是挺有意思的。 我认识一位师兄在“耳语”做运营,我参加过“耳语”的线下活动,跟技术经理王宇成聊过,那次谈话让我受益匪浅。之后我投了“耳语”的简历,再跟大牛通话过一次,那次他给了我笔试题,两道。 拿到题我立马跑去图书馆借了一本《Erlang程序设计》,花了三天把答案发了回去。大牛回邮件问我什么时间有空,再通一次电话。我回复了他,结果我等了一个礼拜也没收到电话,我甚至再给他发邮件问他我是否还有实习机会。一直没收到回复,然后就没有然后了。。。。。。

Erlang:

“是一种通用的并行程序设计语言,运作于虚拟机的解释型语言,Erlang也支持脚本方式执行。在程序设计范型上,Erlang属于多重范型编程语言,涵盖函数式、并行及分布式。循序运行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言。”---维基百科

面向并发?

“Erlang的并发特性源自语言本身而非操作系统。它把现实世界模拟成一系列的进程,期间仅靠交换消息进行互动,由此Erlang简化了并行编程。在Erlang的世界中,存在并行进程但是没有锁,没有同步方法,也不存在共享内存污染的可能,因为Erlang根本没有共享内存。 Eralng程序可以有几百万个超轻量级的进程组成。这些进程可惜运行在单处理器、多核处理器或者多处理网络上。”---《Erlang程序设计》

好了,这也是一门很“牛”的语言。我在入门的时候一开始没有适应“函数式编程”的习惯。 下面贴两道题: 第一道:列表交叉

-module (interleave).
-export ([main/0]).
% -compile(export_all).

%   interleave.erl 
%   主程序入口:main()  interleave:main().
%   通过修改MyList获得更多测试

loop(0,_)->
    [];
loop(Num,TempList)->
    %得到递归的列表
    N=[Tx||[_|Tx]<-TempList],
    %取子列表的头
    [Hx||[Hx|_]<-TempList]++loop(Num-1,N).

main() ->
    %MyList可以任意
    MyList=[[1,2,3],[4],[5,6,7,8]],
    io:format("Old list:~w~n",[MyList]),
    %%由最长子列表,确定循环次数 
    Num=length(lists:max(MyList)),
    NewList=loop(Num,MyList),
    io:format("New list:~w~n",[NewList]).

python代码无压力:

l=[[1,2,3],[4],[5,6,7,8]]
new_l=[]
for x in xrange(len(max(l))):
    new_l.extend(map(lambda x:x and x.pop(0),l))
print [x for x in new_l if x !=[]]

第二道:5个立方数

-module (cube).
-export ([main/0]).
% -compile(export_all).

%   cube.erl 
%   主程序入口:main()  cube:main().
%   启用进程字典 用来加快速度

split(N)->
    %将数字转成列表
    lists:map(fun(X)->X-48 end,integer_to_list(N)).

loop(Num)->
    Cube=Num*Num*Num,
    %为保证速度 启用进程字典 key--数字序列 通过排序保证相同的key 
    Key=lists:sort(split(Cube)),
    Temp=case get(Key) of
        undefined->[];
        L->L
    end,
    %在key相同的情况下 保证value列表元素的增加 
    %L是先前的列表结果 所以知道列表元素是从前面添加的
    Value=[Cube|Temp],
    if
        %length若为5 则为所求
        length(Value)==5->
            %将Value倒置就能取到最大值
            io:format("The smallest cube five permutations:~w~n",[lists:last(Value)]),
            init:stop();
        true->
            %length<5则继续增加Value的length,同时更新C(key)对应的value
            put(Key,Value),
            loop(Num+1)
    end.
 
main()->
    %节省时间 从405开始 
    loop(405).