<?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>Anrs Hu &#187; 递归</title>
	<atom:link href="http://anrs.sacredfir.com/archives/tag/%e9%80%92%e5%bd%92/feed" rel="self" type="application/rss+xml" />
	<link>http://anrs.sacredfir.com</link>
	<description>你所知的一切...</description>
	<lastBuildDate>Sun, 13 Dec 2009 10:34:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>无聊 &#8212; 比较下线性递归和尾递归、函数调用和 lambda 演算</title>
		<link>http://anrs.sacredfir.com/archives/66</link>
		<comments>http://anrs.sacredfir.com/archives/66#comments</comments>
		<pubDate>Fri, 21 Aug 2009 00:56:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[递归]]></category>

		<guid isPermaLink="false">http://anrs.sacredfir.com/?p=66</guid>
		<description><![CDATA[不多话，直接上图上真相&#8230;
代码：




#!/usr/local/bin/python2.6


#coding=utf-8


&#160;


&#160;


fib1 = lambda n: 1 if n &#60; 3 else fib1&#40;n &#8211; 2&#41; + fib1&#40;n &#8211; 1&#41;


&#160;


def fib2&#40;n&#41;:


&#160; &#160; if n &#60; 3:


&#160; &#160; &#160; &#160; return 1


&#160; &#160; return fib2&#40;n &#8211; 2&#41; + fib2&#40;n &#8211; 1&#41;


&#160;


def fib3&#40;n&#41;:


&#160; &#160; f = &#40;lambda i, first, second:


&#160; &#160; &#160; &#160; &#160; &#160; &#160;second if i &#62;= n [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: 16px;">不多话，直接上图上真相&#8230;</span></p>
<p><span style="font-size: 16px;">代码：</span></p>
<p><span style="font-size: 16px;"></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/local/bin/python2.6</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#coding=utf-8</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">fib1 = <span class="kw1">lambda</span> n: <span class="nu0">1</span> <span class="kw1">if</span> n &lt; <span class="nu0">3</span> <span class="kw1">else</span> fib1<span class="br0">&#40;</span>n &#8211; <span class="nu0">2</span><span class="br0">&#41;</span> + fib1<span class="br0">&#40;</span>n &#8211; <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> fib2<span class="br0">&#40;</span>n<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> n &lt; <span class="nu0">3</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> fib2<span class="br0">&#40;</span>n &#8211; <span class="nu0">2</span><span class="br0">&#41;</span> + fib2<span class="br0">&#40;</span>n &#8211; <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> fib3<span class="br0">&#40;</span>n<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; f = <span class="br0">&#40;</span><span class="kw1">lambda</span> i, first, second:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;second <span class="kw1">if</span> i &gt;= n <span class="kw1">else</span> f<span class="br0">&#40;</span>i + <span class="nu0">1</span>, second, first + second<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> f<span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">0</span>, <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> fib4<span class="br0">&#40;</span>n<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">def</span> _fib4<span class="br0">&#40;</span>i, first, second<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> i &gt;= n:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> second</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _fib4<span class="br0">&#40;</span>i + <span class="nu0">1</span>, second, first + second<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> _fib4<span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">0</span>, <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> __name__ == <span class="st0">&#8216;__main__&#8217;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">41</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> fib1<span class="br0">&#40;</span>i<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> fib2<span class="br0">&#40;</span>i<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> fib3<span class="br0">&#40;</span>i<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> fib4<span class="br0">&#40;</span>i<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p></span></p>
<p><span style="font-size: 16px;">结论：<br />
<img class="alignnone size-full wp-image-67" title="screenshot_049" src="http://anrs.sacredfir.com/wp-content/uploads/2009/08/screenshot_049.png" alt="screenshot_049" width="729" height="508" /></span></p>
<p><span style="font-size: 16px;">1. fib1/fib2 的 40 次调用累计 5 亿次以上的递归，总耗时 653 秒多；fib3 的 lambda 和 _fib4 的 40 次调用累计 820 次递归，总耗时不到 0.1 秒</span></p>
<p><span style="font-size: 16px;">2. 函数调用与 lambda 演算区别不大，5 亿次以上的递归调用，差异仍然保持在 20 秒内</span></p>
<p><span style="font-size: 16px;">3. 能用尾递的还用线递，都是虎逼青年&#8230;</span></p>
]]></content:encoded>
			<wfw:commentRss>http://anrs.sacredfir.com/archives/66/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
