<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Seateng Blog &#187; Erlang</title>
	<atom:link href="http://blog.seateng.cn/categories/erlang/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.seateng.cn</link>
	<description>[spawn(fun()-&#62;Browser ! {self(), share(X)}end) &#124;&#124; X &#60;- [&#34;Web开发&#34;, &#34;网站构架&#34;, &#34;分布式开发&#34;]]</description>
	<lastBuildDate>Tue, 06 Dec 2011 09:25:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Erlang Tail-recursive</title>
		<link>http://blog.seateng.cn/archives/2009/05/erlang-tail-recursiv.html</link>
		<comments>http://blog.seateng.cn/archives/2009/05/erlang-tail-recursiv.html#comments</comments>
		<pubDate>Mon, 18 May 2009 03:31:49 +0000</pubDate>
		<dc:creator>Seateng</dc:creator>
				<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://blog.seateng.cn/?p=161</guid>
		<description><![CDATA[在Erlang中的两种递归写法 普通递归: recursive_sum([H&#124;T]) -> H+recursive_sum(T); recursive_sum([]) -> 0. 尾递归: sum(L) -> sum(L, 0). sum([H&#124;T], Sum) -> sum(T, Sum + H); sum([], Sum) -> Sum. 在Erlang文档效能向导部分有说明，尾递归比普通递归更快。 普通递归H+recursive_sum(T);在recursive_sum(T);返回之前H都会被压入stack等到返回结果再计算。 递归越深，内存将被吃的越多。面向过程编程或者面向对象编程也会常用到递归函数。当在Erlang这种函数式编程里无疑将更经常使用递归函数。所以更应该注意递归函数的效率和系统开销。 反过来在面向过程或者面向对象的语言中也可以用尾递归来提高效率减少系统开销。 以PHP为例子 &#60;?php $n = 3; $sum = 0; //尾递归 function TailRecursive($n, $sum) { if ($n&#62;0) { $sum += $n; TailRecursive($n-1, &#38;$sum); } } TailRecursive($n, &#38;$sum); echo $sum; [...]]]></description>
			<content:encoded><![CDATA[<p>在Erlang中的两种递归写法<br />
普通递归:<br />
recursive_sum([H|T]) -> H+recursive_sum(T);<br />
recursive_sum([])      -> 0.<br />
尾递归:<br />
sum(L) -> sum(L, 0).<br />
sum([H|T], Sum) -> sum(T, Sum + H);<br />
sum([], Sum)      -> Sum.<br />
在Erlang文档效能向导部分有说明，尾递归比普通递归更快。<br />
普通递归H+recursive_sum(T);在recursive_sum(T);返回之前H都会被压入stack等到返回结果再计算。<br />
递归越深，内存将被吃的越多。面向过程编程或者面向对象编程也会常用到递归函数。当在Erlang这种函数式编程里无疑将更经常使用递归函数。所以更应该注意递归函数的效率和系统开销。<br />
反过来在面向过程或者面向对象的语言中也可以用尾递归来提高效率减少系统开销。<br />
<span id="more-161"></span><br />
以PHP为例子</p>
<pre class="brush: php; highlight: [5,15]; title: ;">
&lt;?php
$n   = 3;
$sum = 0;
//尾递归
function TailRecursive($n, $sum)
{
    if ($n&gt;0) {
        $sum += $n;
    	TailRecursive($n-1, &amp;$sum);
    }
}
TailRecursive($n, &amp;$sum);
echo $sum;
//普通递归
function Recursive($n)
{
    if ($n&gt;0) {
    	return $n+Recursive($n-1);
    }else{
        return 0;
    }
}
$sum = Recursive($n);
echo $sum;
?&gt;
</pre>
<p>当然现在很多语言的编译器都很智能会自动优化，但还是自己知根知底的好。<br />
注：<a href="http://www.erlang.org/doc/efficiency_guide/myths.html#2.3" target="_blank">Erlang 文档关于Tail-recursive的说明</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.seateng.cn/archives/2009/05/erlang-tail-recursiv.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang Md5</title>
		<link>http://blog.seateng.cn/archives/2009/05/erlang-md5.html</link>
		<comments>http://blog.seateng.cn/archives/2009/05/erlang-md5.html#comments</comments>
		<pubDate>Sat, 09 May 2009 17:15:27 +0000</pubDate>
		<dc:creator>Seateng</dc:creator>
				<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://blog.seateng.cn/?p=153</guid>
		<description><![CDATA[io:format(lists:flatten(array:to_list(array:new([{size,16},{default,"~.16b"}])), &#8220;~n&#8221;), binary_to_list(erlang:md5(&#8220;hello&#8221;))). 之前一直以为上面这段MD5没问题，突然有个地方用到，调试了1天发现居然是这个~.16b有问题，当md5的二进制值小于16时少了一位。比如 7 ~.16b的结果是7其实MD5字符串表示应该用两个字符串表示一个16进制值，所以应该是07。 换了一段仔细看了个详细。 -module(md5). -export([md5_hex/1]). md5_hex(S) -&#62; Md5_bin = erlang:md5(S), Md5_list = binary_to_list(Md5_bin), lists:flatten(list_to_hex(Md5_list)). list_to_hex(L) -&#62; lists:map(fun(X) -&#62; int_to_hex(X) end, L). int_to_hex(N) when N &#60; 256 -&#62; [hex(N div 16), hex(N rem 16)]. hex(N) when N &#60; 10 -&#62; $0+N; hex(N) when N &#62;= 10, N &#60; 16 -&#62; $a + [...]]]></description>
			<content:encoded><![CDATA[<p>io:format(lists:flatten(array:to_list(array:new([{size,16},{default,"~.16b"}])), &#8220;~n&#8221;), binary_to_list(erlang:md5(&#8220;hello&#8221;))).</p>
<p>之前一直以为上面这段MD5没问题，突然有个地方用到，调试了1天发现居然是这个~.16b有问题，当md5的二进制值小于16时少了一位。比如 7 ~.16b的结果是7其实MD5字符串表示应该用两个字符串表示一个16进制值，所以应该是07。<br />
换了一段仔细看了个详细。</p>
<pre class="brush: php; title: ;">
-module(md5).
-export([md5_hex/1]).

md5_hex(S) -&gt;
       Md5_bin =  erlang:md5(S),
       Md5_list = binary_to_list(Md5_bin),
       lists:flatten(list_to_hex(Md5_list)).

list_to_hex(L) -&gt;
       lists:map(fun(X) -&gt; int_to_hex(X) end, L).

int_to_hex(N) when N &lt; 256 -&gt;
       [hex(N div 16), hex(N rem 16)].

hex(N) when N &lt; 10 -&gt;
       $0+N;
hex(N) when N &gt;= 10, N &lt; 16 -&gt;
       $a + (N-10).
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.seateng.cn/archives/2009/05/erlang-md5.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

