存档

‘Erlang’ 分类的存档

在Erlang中的两种递归写法
普通递归:
recursive_sum([H|T]) -> H+recursive_sum(T);
recursive_sum([]) -> 0.
尾递归:
sum(L) -> sum(L, 0).
sum([H|T], Sum) -> sum(T, Sum + H);
sum([], Sum) -> Sum.
在Erlang文档效能向导部分有说明,尾递归比普通递归更快。
普通递归H+recursive_sum(T);在recursive_sum(T);返回之前H都会被压入stack等到返回结果再计算。
递归越深,内存将被吃的越多。面向过程编程或者面向对象编程也会常用到递归函数。当在Erlang这种函数式编程里无疑将更经常使用递归函数。所以更应该注意递归函数的效率和系统开销。
反过来在面向过程或者面向对象的语言中也可以用尾递归来提高效率减少系统开销。

五 18th, 2009 | Filed under Erlang
标签:

io:format(lists:flatten(array:to_list(array:new([{size,16},{default,"~.16b"}])), “~n”), binary_to_list(erlang:md5(“hello”))).
之前一直以为上面这段MD5没问题,突然有个地方用到,调试了1天发现居然是这个~.16b有问题,当md5的二进制值小于16时少了一位。比如 7 ~.16b的结果是7其实MD5字符串表示应该用两个字符串表示一个16进制值,所以应该是07。
换了一段仔细看了个详细。
[php]
-module(md5).
-export([md5_hex/1]).
md5_hex(S) ->
Md5_bin = erlang:md5(S),
Md5_list = binary_to_list(Md5_bin),
lists:flatten(list_to_hex(Md5_list)).
list_to_hex(L) ->
lists:map(fun(X) -> int_to_hex(X) end, L).
int_to_hex(N) when N < 256 ->
[...]

五 10th, 2009 | Filed under Erlang