﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-庄周梦蝶，孰蝶是我，我是孰蝶？一梦至今，蝶我已难分-随笔分类-计算机科学与基础</title><link>http://www.blogjava.net/killme2008/category/22252.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 14 May 2008 17:51:41 GMT</lastBuildDate><pubDate>Wed, 14 May 2008 17:51:41 GMT</pubDate><ttl>60</ttl><item><title>sicp3.5.2、3.5.3节部分习题尝试解答</title><link>http://www.blogjava.net/killme2008/archive/2008/05/13/200312.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 13 May 2008 15:52:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/05/13/200312.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/200312.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/05/13/200312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/200312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/200312.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 本节主要讲述无穷流。<br />
3.53，显然<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;s&nbsp;(cons</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(add</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;s&nbsp;s)))</span></div>
定义是2的n次方组成的无穷数列，2,4,8,16,32...<br />
<br />
3.54，定义阶乘组成的无穷序列：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(mul</span><span style="color: #000000;">-</span><span style="color: #000000;">streams&nbsp;s1&nbsp;s2)<br />
&nbsp;&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">map&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;s1&nbsp;s2))<br />
(define&nbsp;factorials&nbsp;(cons</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(mul</span><span style="color: #000000;">-</span><span style="color: #000000;">streams&nbsp;factorials&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">cdr&nbsp;integers))))</span></div>
<br />
3.55解答，比较有趣，也是不难的题目，列出来找出规律就成了，就是将(stream-car s)加到生成的序列中的每个元素上，通过stream-map，最后的结果就是每个元素都是前n个元素累积的结果，我的解答：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(partial</span><span style="color: #000000;">-</span><span style="color: #000000;">sums&nbsp;s)<br />
&nbsp;&nbsp;(cons</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">car&nbsp;s)&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">map&nbsp;(</span><span style="color: #0000ff;">lambda</span><span style="color: #000000;">(x)&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;x&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">car&nbsp;s)))&nbsp;(partial</span><span style="color: #000000;">-</span><span style="color: #000000;">sums&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">cdr&nbsp;s)))))</span></div>
<br />
3.56，有了merge就好办了，根据条件合并起3种情况来就好：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define S (cons</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(merge&nbsp;(scale</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;s&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;(merge&nbsp;(scale</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;s&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;(scale</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;s&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)))))</span></div>
<br />
3.57,略过<br />
<br />
3.58，观察到，num每次都与radix相乘并且radix保持不变，那么radix可以认为是一个基数，den也保持不变作为除数，那么这个序列就是以radix为基数对den求整数商的序列，不明白num为什么每次要变换成余数？这个序列有啥特别的用途呢？未解。<br />
<pre>(expand 1 7 10)<br />
=&gt; 1 4 2 8 5 7 1 4 2 8<br />
<br />
(expand 3 8 10)<br />
=&gt; 3 7 5 0 0 0 0 0 0 0</pre>
3.59解答：<br />
a)只要将序列通过前面定义的mul-streams与整数的倒数序列相乘：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(integrate</span><span style="color: #000000;">-</span><span style="color: #000000;">series&nbsp;s)<br />
&nbsp;&nbsp;(mul</span><span style="color: #000000;">-</span><span style="color: #000000;">streams (stream</span><span style="color: #000000;">-</span><span style="color: #000000;">map&nbsp;(</span><span style="color: #0000ff;">lambda</span><span style="color: #000000;">(x)&nbsp;(</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;x))&nbsp;integers)&nbsp;s))</span></div>
<br />
b)照着定义来了，cons的级数注意使用scale-stream乘以-1：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define sine</span><span style="color: #000000;">-</span><span style="color: #000000;">series<br />
&nbsp;&nbsp;(cons</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;0&nbsp;(integrate</span><span style="color: #000000;">-</span><span style="color: #000000;">series&nbsp;cosine</span><span style="color: #000000;">-</span><span style="color: #000000;">series)))<br />
<br />
(define cosine</span><span style="color: #000000;">-</span><span style="color: #000000;">series<br />
&nbsp;&nbsp;(cons</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;(scale</span><span style="color: #000000;">-</span><span style="color: #000000;">stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(integrate</span><span style="color: #000000;">-</span><span style="color: #000000;">series&nbsp;sine</span><span style="color: #000000;">-</span><span style="color: #000000;">series)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)))</span></div>
<br />
3.64解答：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">limit&nbsp;s&nbsp;tolerance)<br />
&nbsp;&nbsp;(define&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">limit</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;stream&nbsp;current)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #0000ff;">or</span><span style="color: #000000;">&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">null?&nbsp;stream)&nbsp;(null?&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">car&nbsp;stream)))&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">f)</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((next&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">car&nbsp;stream)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;(abs&nbsp;(</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;next&nbsp;current))&nbsp;tolerance)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">limit</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">cdr&nbsp;stream)&nbsp;next))))))<br />
&nbsp;&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">limit</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">cdr&nbsp;s)&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">car&nbsp;s)))</span></div>
<br />
习题3.65：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(ln</span><span style="color: #000000;">-</span><span style="color: #000000;">summands&nbsp;n)<br />
&nbsp;&nbsp;(cons</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;(</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">&nbsp;n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(stream</span><span style="color: #000000;">-</span><span style="color: #000000;">map&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;(ln</span><span style="color: #000000;">-</span><span style="color: #000000;">summands&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)))))<br />
(define&nbsp;ln</span><span style="color: #000000;">-</span><span style="color: #000000;">stream&nbsp;(partial</span><span style="color: #000000;">-</span><span style="color: #000000;">sums&nbsp;(ln</span><span style="color: #000000;">-</span><span style="color: #000000;">summands&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)))<br />
(define&nbsp;ln</span><span style="color: #000000;">-</span><span style="color: #000000;">stream2&nbsp;(euler</span><span style="color: #000000;">-</span><span style="color: #000000;">transform&nbsp;ln</span><span style="color: #000000;">-</span><span style="color: #000000;">stream))<br />
(define&nbsp;ln</span><span style="color: #000000;">-</span><span style="color: #000000;">stream3&nbsp;(accelerated</span><span style="color: #000000;">-</span><span style="color: #000000;">sequence&nbsp;euler</span><span style="color: #000000;">-</span><span style="color: #000000;">transform&nbsp;ln</span><span style="color: #000000;">-</span><span style="color: #000000;">stream))</span></div>
经过欧拉变换加速过的级数收敛的很快，测测就知道<br /><img src ="http://www.blogjava.net/killme2008/aggbug/200312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-05-13 23:52 <a href="http://www.blogjava.net/killme2008/archive/2008/05/13/200312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scheme解决约瑟夫环问题（续）</title><link>http://www.blogjava.net/killme2008/archive/2008/04/16/193331.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 16 Apr 2008 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/04/16/193331.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/193331.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/04/16/193331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/193331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/193331.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; sicp的习题3.22，也就是以消息传递的风格重新实现队列，我的解答如下：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">queue)<br />
&nbsp;&nbsp;(let&nbsp;((front</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">())</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(rear</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">()))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;(define&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">front</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr!&nbsp;ptr)&nbsp;(set!&nbsp;front</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr&nbsp;ptr))<br />
&nbsp;&nbsp;(define&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">rear</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr!&nbsp;ptr)&nbsp;(set!&nbsp;rear</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr&nbsp;ptr))<br />
&nbsp;&nbsp;(define&nbsp;(empty</span><span style="color: #000000;">-</span><span style="color: #000000;">queue?)&nbsp;(null?&nbsp;front</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr))<br />
&nbsp;&nbsp;(define&nbsp;(front</span><span style="color: #000000;">-</span><span style="color: #000000;">queue)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(empty</span><span style="color: #000000;">-</span><span style="color: #000000;">queue?)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(error&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">FRONT&nbsp;called&nbsp;with&nbsp;an&nbsp;empty&nbsp;queue</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(car&nbsp;front</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr)))<br />
&nbsp;&nbsp;(define&nbsp;(insert</span><span style="color: #000000;">-</span><span style="color: #000000;">queue!&nbsp;item)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((new</span><span style="color: #000000;">-</span><span style="color: #000000;">pair&nbsp;(cons&nbsp;item&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">())))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((empty</span><span style="color: #000000;">-</span><span style="color: #000000;">queue?)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">front</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr!&nbsp;new</span><span style="color: #000000;">-</span><span style="color: #000000;">pair)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">rear</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr!&nbsp;new</span><span style="color: #000000;">-</span><span style="color: #000000;">pair))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">cdr!&nbsp;rear</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr&nbsp;new</span><span style="color: #000000;">-</span><span style="color: #000000;">pair)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">rear</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr!&nbsp;new</span><span style="color: #000000;">-</span><span style="color: #000000;">pair)))))<br />
&nbsp;&nbsp;(define&nbsp;(delete</span><span style="color: #000000;">-</span><span style="color: #000000;">queue!)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((empty</span><span style="color: #000000;">-</span><span style="color: #000000;">queue?)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(error&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">DELETE!&nbsp;called&nbsp;with&nbsp;an&nbsp;empty&nbsp;queue</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;queue))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">front</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr!&nbsp;(cdr&nbsp;front</span><span style="color: #000000;">-</span><span style="color: #000000;">ptr)))))<br />
&nbsp;&nbsp;(define&nbsp;(dispatch&nbsp;m)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((eq?&nbsp;m&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">front-queue)&nbsp;(front-queue))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((eq?&nbsp;m&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">empty-queue?)&nbsp;(empty-queue?))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((eq?&nbsp;m&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">insert-queue!)&nbsp;insert-queue!)</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((eq?&nbsp;m&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">delete-queue!)&nbsp;delete-queue!)</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(error&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Unknow&nbsp;method</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;m))))<br />
&nbsp;&nbsp;&nbsp;&nbsp;dispatch))<br />
(define&nbsp;(front</span><span style="color: #000000;">-</span><span style="color: #000000;">queue&nbsp;z)&nbsp;(z&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">front-queue))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">(define&nbsp;(empty</span><span style="color: #000000;">-</span><span style="color: #000000;">queue?&nbsp;z)&nbsp;(z&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">empty-queue?))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">(define&nbsp;(insert</span><span style="color: #000000;">-</span><span style="color: #000000;">queue!&nbsp;z&nbsp;item)&nbsp;((z&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">insert-queue!)&nbsp;item))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">(define&nbsp;(delete</span><span style="color: #000000;">-</span><span style="color: #000000;">queue!&nbsp;z)&nbsp;((z&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">delete-queue!)))</span></div>
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 由此，我才知道自己竟然一直没有想到，scheme完全可以模拟单向循环链表，整整第三章都在讲引入赋值带来的影响，而我却视而不见。在引入了改变函数后，数据对象已经具有OO的性质，模拟链表、队列、table都变的易如反掌。首先，模拟节点对象，节点是一个序对，包括当前节点编号和下一个节点：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;n&nbsp;next)&nbsp;(cons&nbsp;n&nbsp;next))<br />
(define&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">next</span><span style="color: #000000;">-</span><span style="color: #000000;">node!&nbsp;node&nbsp;next)&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">cdr!&nbsp;node&nbsp;next))<br />
(define&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">node</span><span style="color: #000000;">-</span><span style="color: #000000;">number!&nbsp;node&nbsp;n)&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">car!&nbsp;node&nbsp;n))<br />
(define&nbsp;(get</span><span style="color: #000000;">-</span><span style="color: #000000;">number&nbsp;node)&nbsp;(car&nbsp;node))<br />
(define&nbsp;(get</span><span style="color: #000000;">-</span><span style="color: #000000;">next</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;node)&nbsp;(cdr&nbsp;node))</span></div>
<br />
&nbsp;&nbsp;&nbsp; 有了节点，实现了下单向循环链表：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">cycle</span><span style="color: #000000;">-</span><span style="color: #000000;">list&nbsp;n)<br />
&nbsp;&nbsp;(let&nbsp;((head&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">())))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;(define&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">list&nbsp;current&nbsp;i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((next</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">())))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i&nbsp;n)&nbsp;current)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">next</span><span style="color: #000000;">-</span><span style="color: #000000;">node!&nbsp;current&nbsp;next</span><span style="color: #000000;">-</span><span style="color: #000000;">node)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">list&nbsp;next</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))))))<br />
&nbsp;&nbsp;&nbsp;&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">next</span><span style="color: #000000;">-</span><span style="color: #000000;">node!&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">list&nbsp;head&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;head)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;head))</span></div>
<br />
&nbsp;&nbsp;&nbsp; make-cycle-list生成一个有N个元素的环形链表，比如(make-cycle-list 8)的结果如下<br />
#0=(1 2 3 4 5 6 7 8 . #0#)<br />
&nbsp;&nbsp;&nbsp; Drscheme形象地展示了这是一个循环的链表。那么约瑟夫环的问题就简单了：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(josephus</span><span style="color: #000000;">-</span><span style="color: #000000;">cycle&nbsp;n&nbsp;m)<br />
&nbsp;&nbsp;(let&nbsp;((head&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">cycle</span><span style="color: #000000;">-</span><span style="color: #000000;">list&nbsp;n)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;(define&nbsp;(josephus</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;prev&nbsp;current&nbsp;i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((next</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;(get</span><span style="color: #000000;">-</span><span style="color: #000000;">next</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;current)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((eq?&nbsp;next</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;current)&nbsp;(get</span><span style="color: #000000;">-</span><span style="color: #000000;">number&nbsp;current))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(set</span><span style="color: #000000;">-</span><span style="color: #000000;">next</span><span style="color: #000000;">-</span><span style="color: #000000;">node!&nbsp;prev&nbsp;next</span><span style="color: #000000;">-</span><span style="color: #000000;">node)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(josephus</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;prev&nbsp;next</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;m))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(josephus</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;current&nbsp;next</span><span style="color: #000000;">-</span><span style="color: #000000;">node&nbsp;(</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))))))<br />
&nbsp;&nbsp;&nbsp;&nbsp;(josephus</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;head&nbsp;head&nbsp;m)))</span></div>
<br />
&nbsp;&nbsp;&nbsp; 从head节点开始计数，每到m，就将当前节点删除（通过将前一个节点的next-node设置为current的下一个节点），最后剩下的节点的编号就是答案。<br /><img src ="http://www.blogjava.net/killme2008/aggbug/193331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-04-16 10:27 <a href="http://www.blogjava.net/killme2008/archive/2008/04/16/193331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于binary search</title><link>http://www.blogjava.net/killme2008/archive/2008/04/02/190285.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 02 Apr 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/04/02/190285.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/190285.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/04/02/190285.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/190285.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/190285.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 编程珠玑Column 4关于binary search的部分相当精彩，<font face="Courier New">1946年就有人发表binary search，但直到1962第一个正确运行的算法才写出来。尽管算法描述看起来简单明了，但是要写的正确却是有许多地方要仔细考虑。作者着重强调的是对程序正确性的分析方法，仔细分析方法的</font><font face="Courier New">pre-condition, invariant,和post-condition。</font>g9老大翻译过Joshua Bloch在google blog上的文章《<a href="http://blog.csdn.net/g9yuayon/archive/2006/06/04/772382.aspx">号外，号外，几乎所有的binary search和mergsort都有错</a>》，原文在<a href="http://feeds.feedburner.com/~r/blogspot/gJZg/~3/144582870/extra-extra-read-all-about-it-nearly.html">这里</a>。今天看了下原文，有更新，对于求中值索引的c/c++方法原文仍然是有错的，本来是这样：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;mid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((unsigned)&nbsp;(low&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;high))&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">。</span></div>
<br />
但是在c99标准中，对于两个signed数值之和，如果溢出结果是未定义的(undefined)，也就是说与编译器实现相关。上面的代码应该修改为：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">mid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)low&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)high))&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span></div>
<br />
我查了下jdk6的java.util.Arrays的源码，joshua bloch说的这个问题已经解决，现在的binary search如下：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Like&nbsp;public&nbsp;version,&nbsp;but&nbsp;without&nbsp;range&nbsp;checks.</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;binarySearch0(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;a,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fromIndex,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;toIndex,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;low&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fromIndex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;high&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;toIndex&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(low&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;high)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;mid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(low&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;high)&nbsp;</span><span style="color: #000000;">&gt;&gt;&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;midVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a[mid];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(midVal&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;key)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;low&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mid&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(midVal&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;key)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;high&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mid&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;mid;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;key&nbsp;found</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">(low&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;key&nbsp;not&nbsp;found.</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
&nbsp;&nbsp;&nbsp; 如原文所讨论的，采用了&gt;&gt;&gt;操作符替代除以2<img src ="http://www.blogjava.net/killme2008/aggbug/190285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-04-02 10:08 <a href="http://www.blogjava.net/killme2008/archive/2008/04/02/190285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scheme解约瑟夫环问题</title><link>http://www.blogjava.net/killme2008/archive/2008/03/20/187552.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 20 Mar 2008 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/03/20/187552.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/187552.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/03/20/187552.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/187552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/187552.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 看了javaeye上一个解决约瑟夫环的问题的帖子，就想能不能用scheme来解决。如果采用推导出的数学公式来处理当然很简单了：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(joseph&nbsp;n&nbsp;m)<br />
&nbsp;&nbsp;(define&nbsp;(joseph</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;init&nbsp;s)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;init&nbsp;n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;s&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(joseph</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;init&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;(remainder&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;s&nbsp;m)&nbsp;init))))<br />
&nbsp;&nbsp;(joseph</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;0))</span></div>
&nbsp;&nbsp;&nbsp; 我想是否可以用一般的模拟算法来实现？也就是模拟一个循环链表，每次删除第m个元素。弄了个比较丑陋的实现：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(enumrate</span><span style="color: #000000;">-</span><span style="color: #000000;">interval&nbsp;low&nbsp;high)<br />
&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;low&nbsp;high)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">()</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;low&nbsp;(enumrate</span><span style="color: #000000;">-</span><span style="color: #000000;">interval&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;low&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;high))))<br />
(define&nbsp;(delete</span><span style="color: #000000;">-</span><span style="color: #000000;">last&nbsp;list)<br />
&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(eq?&nbsp;(cdr&nbsp;list)&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">())</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">()</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(car&nbsp;list)&nbsp;(delete</span><span style="color: #000000;">-</span><span style="color: #000000;">last&nbsp;(cdr&nbsp;list)))))<br />
<br />
(define&nbsp;(joseph</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;init&nbsp;list&nbsp;it)&nbsp;<br />
&nbsp;&nbsp;(let&nbsp;((m&nbsp;(remainder&nbsp;it&nbsp;(length&nbsp;list))))<br />
&nbsp;&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m&nbsp;0)&nbsp;(delete</span><span style="color: #000000;">-</span><span style="color: #000000;">last&nbsp;list))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;(append&nbsp;(cdr&nbsp;list)&nbsp;(reverse&nbsp;init)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(joseph</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;(cons&nbsp;(car&nbsp;list)&nbsp;init)&nbsp;(cdr&nbsp;list)&nbsp;(</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;m&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))))))<br />
(define&nbsp;(joseph&nbsp;n&nbsp;m)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(define&nbsp;(joseph</span><span style="color: #000000;">-</span><span style="color: #000000;">list&nbsp;list&nbsp;m)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(display&nbsp;list)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(newline)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(eq?&nbsp;(cdr&nbsp;list)&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">())</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(car&nbsp;list)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(joseph</span><span style="color: #000000;">-</span><span style="color: #000000;">list&nbsp;(joseph</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">()&nbsp;list&nbsp;m)&nbsp;m)))</span></div>
<br />
计算（joseph 8 3)的过程如下：<br />
(1 2 3 4 5 6 7 8)<br />
(4 5 6 7 8 1 2)<br />
(7 8 1 2 4 5)<br />
(2 4 5 7 8)<br />
(7 8 2 4)<br />
(4 7 8)<br />
(4 7)<br />
(7)<br />
7<br />
<br />
看了这个计算过程就知道我这个方法多糟糕，每次都重新构造列表。不知道看blog的大大们有没有更好的思路？<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/187552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-03-20 19:15 <a href="http://www.blogjava.net/killme2008/archive/2008/03/20/187552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用递归计算阶乘咋不行呢？</title><link>http://www.blogjava.net/killme2008/archive/2008/03/18/187071.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 18 Mar 2008 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/03/18/187071.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/187071.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/03/18/187071.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/187071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/187071.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 读《代码大全2》，已经读了一半，喘口气。总结八个字：百科全书，受益匪浅。小到一个赋值语句、一个循环的编写，大到需求分析、架构设计，无所不包，看后半部分目录，更是扯到了重构、软件工艺、程序员的性格特征这样的话题。恰好手边的工作暂时比较有闲，可以实践下&#8220;创建高质量的代码&#8221;中的部分建议，晚上读书，第二天就重构，乐在其中。这一部分中对设计、子程序、类、变量、语句的处理建议，可能你平常已经在这么做，可作者这么精辟地概括出来让人叹服，而有些地方是你平常绝对很少注意的，特别是在变量和三种常见控制语句的处理上。<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 说说我认为是缺点的地方，就是作者貌似对函数式语言了解很少，举的例子全部用的是广泛应用的静态语言（c/c++,java,vb)。例如作者有这么一句话：<span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry">如果为我工作的程序员用递归去计算阶乘，那么我宁愿换人。作者对递归的态度相当谨慎，这在静态命令式语言中显然是正确的，但是在函数式语言中，由于有尾递归优化的存在，递归反而是最自然的形式，况且我打心里认为递归更符合人类思维。请注意，在FP中只有尾递归的程序才是<strong>线性迭代</strong>的，否则写出来的递归可能是线性递归或者树形递归</span><span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry">，两种情况下都可能导致堆栈溢出并且性能较差。</span><br />
<br />
scheme写阶乘：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(fac&nbsp;n)<br />
&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;n&nbsp;(fac&nbsp;(</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)))))</span></div>
显然这个版本不是尾递归，计算过程是一个线性递归过程，计算(fac 4)的过程如下：<br />
(* 4 （fac 3))<br />
(* 4&nbsp; (3 * (fac 2)))<br />
(* 4&nbsp; (3 * (* 2 (fac 1))))<br />
(* 4&nbsp; (3 * (* 2 1)))<br />
(* 4&nbsp; (3 * 2))<br />
(* 4 6)<br />
24<br />
&nbsp;&nbsp;&nbsp; 因为解释器是采用应用序求值，需要将表达式完全展开，然后依次求值，在这个过程中，解释器内部需要保存一条长长的推迟计算的轨迹。<br />
改写成一个尾递归版本：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(fac n)<br />
&nbsp;&nbsp;(define&nbsp;(fac</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;product&nbsp;n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(fac</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;n&nbsp;product)&nbsp;(</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))))<br />
&nbsp;&nbsp;(fac</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;n))</span></div>
我们来看看它的计算过程：<br />
(fac-iter 1 4)<br />
(fac-iter 4 3)<br />
(fac-iter 12 2)<br />
(fac-iter 24 1)<br />
24<br />
可以看到，在这个过程中，解释器不需要保存计算轨迹，迭代的中间结果通过product变量来保存，这是一个线性迭代的计算过程。<br />
最后再看一个<font size="-1">斐波拉契数列的例子：<br />
</font>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(fib&nbsp;n)<br />
&nbsp; (cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n&nbsp;0)&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (</span><span style="color: #0000ff;">else<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(fib&nbsp;(</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))&nbsp; (fib&nbsp;(</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">))))))</span></div>
<br />
这个计算过程展开是一个树形递归的过程(为什么说是树形？展开下计算过程就知道），改写为线性迭代：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(fib&nbsp;n)<br />
&nbsp;&nbsp;(define&nbsp;(fib</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;a&nbsp;b&nbsp;count)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;count&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(fib</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;a&nbsp;b)&nbsp;a&nbsp;(</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;count&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))))<br />
&nbsp;(fib</span><span style="color: #000000;">-</span><span style="color: #000000;">iter&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;0&nbsp;n))</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 上述的内容在sicp第一章里有更详细的介绍和讨论。<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/187071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-03-18 19:34 <a href="http://www.blogjava.net/killme2008/archive/2008/03/18/187071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Ruby写了个NFA</title><link>http://www.blogjava.net/killme2008/archive/2008/02/25/182053.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 25 Feb 2008 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/02/25/182053.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/182053.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/02/25/182053.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/182053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/182053.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 今天有点空闲，想想用Ruby写个NFA试试。从正则表达式构造NFA采用经典的Thompson算法:正则表达式 -&gt; 后缀表达式 -&gt; 构造NFA。构造了NFA后，用之匹配字符串。一句话，写了个玩具的正则表达式引擎，支持concatenation、alternation以及*、?、+量词，不支持反向引用和转义符。测试了下与Ruby自带的正则表达式引擎的性能对比，慢了3倍<img src="/CuteSoft_Client/CuteEditor/images/emcry.gif" alt="" align="absmiddle" border="0" />。构造NFA没什么问题，主要是匹配运行写的烂，有空再改改。<br />
<br />
nfa.rb<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">module</span><span style="color: rgb(0, 0, 0);"> NFA<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;NFA<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;initialize(state)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@state</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">state<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;step(clist,c)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;clist&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;clist.size</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlist</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">[]&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allNull&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clist.each&nbsp;do&nbsp;</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">t</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;!t.nil?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allNull&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;false&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;t.c</span><span style="color: rgb(0, 0, 0);">!=-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;t.c&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;c&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;t.end.type&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlist.push(t.end.out1)&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;!t.end.out1.end.nil?&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlist.push(t.end.out2)&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;!t.end.out2.end.nil?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif&nbsp;(t.c&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;c&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;t.end.type&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;0)&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;ListUitls.new_list(t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif&nbsp;(t.c&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;!t.end.nil?)&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlist.push(t.end.out1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlist.push(t.end.out2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;step(nlist,&nbsp;c)&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(allNull)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;step(nlist,&nbsp;c)&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(!matched)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlist<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;test?(s)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match(@state,s)<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;match(state,s)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clist&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clist.push(state.out1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clist.push(state.out2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.each_byte&nbsp;do&nbsp;</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">c</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; c&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">c</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">0xFF</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clist&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;step(clist,&nbsp;c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;false&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;clist.size</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;is_match?(clist)<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;is_match?(clist)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clist.each&nbsp;&nbsp;do&nbsp;</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">t</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;true&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;!t.nil?&nbsp;</span><span style="color: rgb(0, 0, 255);">and</span><span style="color: rgb(0, 0, 0);">&nbsp;t.c</span><span style="color: rgb(0, 0, 0);">==-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">and</span><span style="color: rgb(0, 0, 0);">&nbsp;t.end&nbsp;</span><span style="color: rgb(0, 0, 255);">and</span><span style="color: rgb(0, 0, 0);">&nbsp;t.end.is_matched?&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;end<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Paren<br />
&nbsp;&nbsp;&nbsp;&nbsp;attr_accessor:n_alt,:n_atom<br />
&nbsp;&nbsp;end<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;State<br />
&nbsp;&nbsp;&nbsp;&nbsp;attr_accessor&nbsp;:out1,:out2,:type<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;initialize(out1,out2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@out1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">out1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@out2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">out2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@type</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;is_matched?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;@type</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">0<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;end<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition<br />
&nbsp;&nbsp;&nbsp;&nbsp;attr_accessor&nbsp;:c,:end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;initialize(c)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@c</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">c<br />
&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;end<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Frame<br />
&nbsp;&nbsp;&nbsp;&nbsp;attr_accessor&nbsp;:start,:outs<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;initialize(start,outs)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@start</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">start<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@outs</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">outs<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;end<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;ListUitls<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;self.link(list,state)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.each{</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">t</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">&nbsp;t.end</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">state}<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;self.append(list1,list2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list1</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">list2<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;self.new_list(out)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.push(out)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;end<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;self.compile(re)<br />
&nbsp;&nbsp;&nbsp;&nbsp;post&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;re2post(re)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">raise</span><span style="color: rgb(0, 0, 0);">&nbsp;ArgumentError.new,</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">bad&nbsp;regexp!</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;post.nil?<br />
&nbsp;&nbsp;&nbsp;&nbsp;state&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;post2nfa(post);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">raise</span><span style="color: rgb(0, 0, 0);">&nbsp;RuntimeError.new,</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">construct&nbsp;nfa&nbsp;from&nbsp;postfix&nbsp;fail!</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;state.nil?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;NFA.new(state);<br />
&nbsp;&nbsp;end<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;self.post2nfa(postfix)<br />
&nbsp;&nbsp;&nbsp;&nbsp;stack</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;s</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">nil<br />
&nbsp;&nbsp;&nbsp;&nbsp;t</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">t1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">t2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">nil&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;e1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">e2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">e</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">nil&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;nil&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;postfix.nil?<br />
&nbsp;&nbsp;&nbsp;&nbsp;postfix.each_byte&nbsp;do&nbsp;</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">p</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;p.chr<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">.</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;stack.pop()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;stack.pop()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListUitls.link(e1.outs,&nbsp;e2.start)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(Frame.new(e1.start,&nbsp;e2.outs))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">|</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;stack.pop()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;stack.pop()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1.end&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;e1.start&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2.end&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;e2.start&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;State.new(t1,&nbsp;t2)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(Frame.new(s,&nbsp;ListUitls.append(e1.outs,&nbsp;e2.outs)))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">?</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;stack.pop()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1.end&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;e.start&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;State.new(t1,&nbsp;t2)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(Frame.new(s,&nbsp;ListUitls.append(e.outs,&nbsp;ListUitls.new_list(t2))))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">*</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;stack.pop()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1.end&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;e.start&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;State.new(t1,&nbsp;t2)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListUitls.link(e.outs,&nbsp;s)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(Frame.new(s,&nbsp;ListUitls.new_list(s.out2)))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;stack.pop()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1.end&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;e.start&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;State.new(t1,&nbsp;t2)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListUitls.link(e.outs,&nbsp;s)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(Frame.new(e.start,&nbsp;ListUitls.new_list(t2)))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(p)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;State.new(t,&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(Frame.new(s,&nbsp;ListUitls.new_list(s.out1)))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;stack.pop()&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;nil&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;stack.size()</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">0<br />
&nbsp;&nbsp;&nbsp;&nbsp;end_state&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;State.new(nil,&nbsp;nil)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end_state.type</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.outs.each&nbsp;do&nbsp;</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">tran</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;tran.c</span><span style="color: rgb(0, 0, 0);">!=-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Transition.new(</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">State.new(t1,t2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tran.end</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">s<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.out1.end</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">end_state<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.out2.end</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">end_state<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tran.end</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">end_state&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;e.start&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;start&nbsp;<br />
&nbsp;&nbsp;end<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;self.re2post(re)<br />
&nbsp;&nbsp;&nbsp;&nbsp;n_alt&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;n_atom&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;0&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(128, 0, 0);">""</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;paren</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;re.each_byte&nbsp;do&nbsp;</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">c</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;c.chr&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">(</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(n_atom&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_atom</span><span style="color: rgb(0, 0, 0);">-=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">.</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">Paren.new&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.n_alt&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;n_alt&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.n_atom&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;n_atom&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paren.push(p)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_alt&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;n_atom&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">|</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(n_atom&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;nil<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">&nbsp;(n_atom</span><span style="color: rgb(0, 0, 0);">-=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;0&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">.</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_alt</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">)</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(paren.size()&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;nil<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(n_atom&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;nil&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">&nbsp;(n_atom</span><span style="color: rgb(0, 0, 0);">-=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">0&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">.</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(n_alt</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">0)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">|</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_alt</span><span style="color: rgb(0, 0, 0);">-=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;paren.pop()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_alt&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;p.n_alt&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_atom&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;p.n_atom&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_atom</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">*</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">?</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(n_atom&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;nil&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">c&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(n_atom&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_atom</span><span style="color: rgb(0, 0, 0);">-=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">.</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">c&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_atom</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;nil&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;paren.size()</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">0<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">&nbsp;(&nbsp;(n_atom</span><span style="color: rgb(0, 0, 0);">-=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">.</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(n_alt</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_alt</span><span style="color: rgb(0, 0, 0);">-=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">|</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;result<br />
&nbsp;&nbsp;end<br />
end<br />
</span></div>
<br />
使用：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;nfa&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;NFA::compile(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">a(bb)+a(cdf)*</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">abba</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">abbbba</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;!nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">a</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)&nbsp;<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;!nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">aa</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)&nbsp;<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">abbacdf</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">abbbbacdfcdf</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;!nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">bbbbacdfcdf</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;!nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">abbbacdfcdf</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;!nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">abbbbacdfdf</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">assert</span><span style="color: rgb(0, 0, 0);">&nbsp;!nfa.test?(</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">abbbbacdfdfg</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)</span></div>
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/182053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-02-25 17:46 <a href="http://www.blogjava.net/killme2008/archive/2008/02/25/182053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>位图排序</title><link>http://www.blogjava.net/killme2008/archive/2008/01/07/173362.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 07 Jan 2008 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/01/07/173362.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/173362.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/01/07/173362.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/173362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/173362.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 《编程珠玑》第一章第一题就相当的精彩，做个笔记。题目如下：<br />
输入:&nbsp;&nbsp; 一个包含n个正整数的文件，每个正整数小于n,n等于10的7次方（一千万）。并且文件内的正整数没有重复和关联数据。<br />
<br />
输出:&nbsp; 输入整数的升序排列<br />
&nbsp;<br />
约束： 限制在1M左右内存，充足的磁盘空间<br />
<br />
&nbsp;&nbsp;&nbsp; 假设整数占32位，1M内存可以存储大概250000个整数，第一个方法就是采用基于磁盘的合并排序算法，第二个办法就是将0-9999999切割成40个区间，分40次扫描（10000000/250000)，每次读入250000个在一个区间的整数，并在内存中使用快速排序。书中提出的第三个解决办法是采用bitmap（或者称为bit vector）来表示所有数据集合（注意到条件，数据没有重复），这样就可以一次性将数据读入内存，减少了扫描次数。算法的伪代码如下：<br />
阶段1：初始化一个空集合<br />
&nbsp;&nbsp;&nbsp;&nbsp; for i=[0,n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit[i]=0;<br />
阶段2：读入数据i，并设置bit[i]=1<br />
&nbsp;&nbsp;&nbsp; for each i in the input file<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit[i]=1;<br />
阶段3：输出排序的结果<br />
&nbsp;&nbsp; for i=[0,n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if bit[i]==1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write i on the output file<br />
<br />
这个算法的时间复杂度在O(n)，用c语言写的版本可以在10秒内完成任务！c语言的源码在该书主页上有，这里给一个java的测试版，加上我的理解注释：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;Created&nbsp;by&nbsp;IntelliJ&nbsp;IDEA.<br />
&nbsp;*&nbsp;User: zhuangxd<br />
&nbsp;*&nbsp;Date:&nbsp;2008-1-7<br />
&nbsp;*&nbsp;Time:&nbsp;14:30:44<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BitSortTest&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;BITSPERWORD&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">32</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">整数位数</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;SHIFT&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;MASK&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x1F</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">5位遮蔽 0B11111</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;N&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10000000</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用int数组来模拟位数组，总计(1&nbsp;+&nbsp;N&nbsp;/&nbsp;BITSPERWORD)*BITSPERWORD位，足以容纳N</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;N&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;BITSPERWORD)];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitsort(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]{</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">10000</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">9999</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4567</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">78902</span><span style="color: #000000;">});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;bitsort(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;array)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;N;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clr(i);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">位数组所有位清0</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;array.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set(array[i]);&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">阶段2</span><br />
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;N;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(test(i))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">置a[i&gt;&gt;SHIFT]的第(i&nbsp;&amp;&nbsp;MASK)位为1，</span><span style="color: #008000;">也就是位数组的第i位为1</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;set(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;SHIFT]&nbsp;</span><span style="color: #000000;">|=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;MASK));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">置a[i&gt;&gt;SHIFT]的第(i&nbsp;&amp;&nbsp;MASK)位为0,也就是位数组的第i位为0</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;clr(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;SHIFT]&nbsp;</span><span style="color: #000000;">&amp;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;MASK));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">测试位数组的第i位是否为1</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;test(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(a[i&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;SHIFT]&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;MASK)))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;MASK));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/173362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-01-07 15:30 <a href="http://www.blogjava.net/killme2008/archive/2008/01/07/173362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sicp 3.12 3.13 3.14习题解答</title><link>http://www.blogjava.net/killme2008/archive/2007/10/18/153927.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 18 Oct 2007 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/10/18/153927.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/153927.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/10/18/153927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/153927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/153927.html</trackback:ping><description><![CDATA[习题3.12，append不是改变函数，不会改变x的结构。append!是改变函数，显然第一个response是(b)，第二个就是(b c d)。图就不画了，画了一次太麻烦了。<br />
<br />
习题3.13,利用set-cdr!形成环，比较有意思：<br />
(define z (make-cycle (list 'a 'b 'c 'd)))<br />
<br />
z在DrScheme上表示为：<br />
#0=(a b c d . #0#)<br />
<br />
形象地展示了一个环，显然运行(last-pair z)将陷入无限递归，因为(null? (cdr x))永远不会为真。<br />
<br />
习题3.14，这道题运行下就知道了，是个倒排list的过程，分析下(mystery v)的运行过程：<br />
(loop (a b c d) '())<br />
(loop (b c d) (a '()))<br />
(loop (c d) (b a))<br />
(loop (d) (c b a))<br />
(loop '() (d c b a))<br />
<br />
习题进度落后于读书进度，残念。<br />
<br />
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/153927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-10-18 15:56 <a href="http://www.blogjava.net/killme2008/archive/2007/10/18/153927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sicp 3.9题解答</title><link>http://www.blogjava.net/killme2008/archive/2007/10/08/151065.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 08 Oct 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/10/08/151065.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/151065.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/10/08/151065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/151065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/151065.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 引入了赋值之后，代换模型失效，3.2小节引入了环境模型。3.9题用于考察对环境模型的理解。递归版本的(factorial 6)的环境结构如下图：<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/9a.gif" alt="" border="0" />&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; blogjava不允许太长的图片，省略了n=3,2,1的三个frame，这些frame的关联环境都是全局环境。<br />
&nbsp;&nbsp;&nbsp; 再看看迭代版本的(factorial 6)的环境结构，同样省去了部分迭代过程，当counter=7的时候迭代停止：<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/9c.gif" alt="" border="0" /><br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/151065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-10-08 14:55 <a href="http://www.blogjava.net/killme2008/archive/2007/10/08/151065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一点领悟吧，关于消息传递与lambda算子</title><link>http://www.blogjava.net/killme2008/archive/2007/08/03/134152.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 03 Aug 2007 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/08/03/134152.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/134152.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/08/03/134152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/134152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/134152.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 昨天在读到《Programming <a title="" href="http://www.erlang.org/">Erlang</a>》第8章，开篇点出Erlang是一门纯粹的消息传递风格语言（message passing），我才算是领悟了消息传递。为了这个问题，我还冒昧地去问javaeye上的T1，对这个问题的兴趣是因为SICP第二章以及《失踪的链环》上的介绍。T1给我解答如下：<span style="font-weight: bold;">智能能对象只是消息传递的一种具体应用.消息传递说的更为清晰一些就是一种映射关系或者说映射规则.f:a-&gt;b;这个规则可以是任意的</span>。我一直将procedural representations of data,也就是sicp中声称intelligent data objects
（智能对象）等价于消息传递， 而其实智能对象仅仅是消息传递的一种具体应用罢了。<br><span style="font-weight: bold;">消息传递机制通俗地来讲就是类似于马路上到处投递小广告的投递者，它采取的是Send and Pray策略,既不关心消息是否能精确的传送到真正需要消息的接收者,而是以广播的方式把消息发送给所有人,然后通过回馈来确定消息接收者的类型</span>（引自《失踪的链环》）。因此，动态语言的duct typing是消息传递风格，智能对象是消息传递风格，显然，Erlang的process间的通信机制同样是消息传递风格（Process之间完全通过send message来进行控制和指示，不确定接收方是否具有处理消息的能力
，异步的，接收的确认也要等待reply）。<br>&nbsp;&nbsp;&nbsp; 再来说说lambda算子理论，推荐下g9老大的lambda算子系列文章，这是开篇《<a href="http://blog.csdn.net/g9yuayon/archive/2006/05/29/759778.aspx">lambda算子简介1.a</a>》，以及另外一篇《<a href="http://blog.csdn.net/pongba/archive/2006/10/15/1336028.aspx">康托尔、哥德尔、图灵——永恒的金色对角线(rev#2)</a>》。lambda算子理论是函数式编程的理论基础，通过9条公理就可以推到出一个图灵完备的形式系统，其中的Y combinator的推导简直是魔法（为了表示递归），再次领略了计算理论的魅力。另外，最近读sicp第三章《模块化、对象和状态》，也理解了最初的面向对象思想来自何处，在引入了内部状态模拟时间变化之后，对象的最初思想也产生了，同时也带来了赋值导致的Side-Effect，而其实这正是动态OO语言中的对象的理念，通过消息来决定对象的type（ducktyping）。可现代的静态OO语言，在type和clas<br>之间画上了等号，java里面说一切都是object，其实他想表达的却是一切都是class，通过type以及函数签名等来决定消息的分派(message dispatch)，导致更多的代码集中在消息分派，而不是真正的计算任务上，可以说静态OO已经偏离原始的对象模型很远。<br>&nbsp;&nbsp;&nbsp; 一点胡思乱想吧，我没有科班经历，所有的东西都是自己在学，在摸索，如有理论和常识上的谬误，请不吝赐教。<br><img src ="http://www.blogjava.net/killme2008/aggbug/134152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-08-03 09:23 <a href="http://www.blogjava.net/killme2008/archive/2007/08/03/134152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sicp 习题3.6-3.8试解</title><link>http://www.blogjava.net/killme2008/archive/2007/08/01/133814.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 01 Aug 2007 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/08/01/133814.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/133814.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/08/01/133814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/133814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/133814.html</trackback:ping><description><![CDATA[习题3.6，我的实现如下：<br>(define rand<br>&nbsp; (let ((x 3))<br>&nbsp;&nbsp;&nbsp;&nbsp; (lambda(arg)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond((eq? arg 'generate)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((lambda()(set! x (rand-update x)) x)