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).