﻿<?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>C++博客-CG@CPPBLOG-随笔分类-我的SICP答案</title><link>http://www.cppblog.com/cuigang/category/6355.html</link><description>写写字，看看书，聊聊天</description><language>zh-cn</language><lastBuildDate>Tue, 12 Jul 2011 02:47:23 GMT</lastBuildDate><pubDate>Tue, 12 Jul 2011 02:47:23 GMT</pubDate><ttl>60</ttl><item><title>我的SICP习题答案（2.36~2.39）</title><link>http://www.cppblog.com/cuigang/archive/2008/07/02/55084.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 01 Jul 2008 16:08:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/07/02/55084.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/55084.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/07/02/55084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/55084.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/55084.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: courier new;"><span style="font-weight: bold;">2.36</span><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;(list&nbsp;(list&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)(list&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">)(list&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">)(list&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">)))<br>(define&nbsp;(accumulate-n&nbsp;op&nbsp;init&nbsp;seqs)<br>&nbsp;&nbsp;(if&nbsp;(null?&nbsp;(car&nbsp;seqs))&nbsp;null<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(accumulate&nbsp;op&nbsp;init&nbsp;(map#&nbsp;(lambda(x)&nbsp;(car&nbsp;x))&nbsp;seqs))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(accumulate-n&nbsp;op&nbsp;init&nbsp;(map#&nbsp;(lambda(x)&nbsp;(cdr&nbsp;x))&nbsp;seqs)))))</span></div>
<br><span style="font-weight: bold;">2.38</span><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: #008000;">;</span><span style="color: #008000;">&gt;&nbsp;(fold-right&nbsp;/&nbsp;1&nbsp;(list&nbsp;1&nbsp;2&nbsp;3))</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">3/2</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&gt;&nbsp;(fold-left&nbsp;/&nbsp;1&nbsp;(list&nbsp;1&nbsp;2&nbsp;3))</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">1/6</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&gt;&nbsp;(fold-right&nbsp;list&nbsp;null&nbsp;(list&nbsp;1&nbsp;2&nbsp;3))</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">(1&nbsp;(2&nbsp;(3&nbsp;())))</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&gt;&nbsp;(fold-left&nbsp;list&nbsp;null&nbsp;(list&nbsp;1&nbsp;2&nbsp;3))</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">(((()&nbsp;1)&nbsp;2)&nbsp;3)</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #008000;">;</span><span style="color: #008000;">&nbsp;(fold-right&nbsp;op&nbsp;i&nbsp;(a&nbsp;b&nbsp;c))&nbsp;=&nbsp;(op&nbsp;a&nbsp;(op&nbsp;b&nbsp;(op&nbsp;c&nbsp;i)))</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&nbsp;(fold-left&nbsp;op&nbsp;i&nbsp;(a&nbsp;b&nbsp;c))&nbsp;&nbsp;=&nbsp;(op&nbsp;(op&nbsp;(op&nbsp;i&nbsp;a)&nbsp;b)&nbsp;c)</span></div>
<br>要 fold-right 和 fold-left 得到相同的结果，显然需要 op 满足交换律。<br><br><span style="font-weight: bold;">2.39</span><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;(reverse-</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;seqs)<br>&nbsp;&nbsp;(fold-right&nbsp;(lambda(x&nbsp;y)&nbsp;(append&nbsp;y&nbsp;(list&nbsp;x)))&nbsp;null&nbsp;seqs))<br>(define&nbsp;(reverse-</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;seqs)<br>&nbsp;&nbsp;(fold-left&nbsp;(lambda(x&nbsp;y)&nbsp;(cons&nbsp;y&nbsp;x))&nbsp;null&nbsp;seqs))</span></div>
<br><br></span> <img src ="http://www.cppblog.com/cuigang/aggbug/55084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-07-02 00:08 <a href="http://www.cppblog.com/cuigang/archive/2008/07/02/55084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（2.33~2.35）</title><link>http://www.cppblog.com/cuigang/archive/2008/06/24/54420.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 23 Jun 2008 16:21:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/06/24/54420.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/54420.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/06/24/54420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/54420.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/54420.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-family: courier new; font-weight: bold;">2.33</span><br style="font-family: courier new;"><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(map+&nbsp;p&nbsp;seque)<br>&nbsp;&nbsp;(accumulate&nbsp;(lambda(x&nbsp;y)&nbsp;(cons&nbsp;(p&nbsp;x)&nbsp;y))&nbsp;null&nbsp;seque))<br><br>(define&nbsp;(append&nbsp;seq1&nbsp;seq2)<br>&nbsp;&nbsp;(accumulate&nbsp;cons&nbsp;seq2&nbsp;seq1))<br><br>(define&nbsp;(length&nbsp;seque)<br>&nbsp;&nbsp;(accumulate&nbsp;(lambda(x&nbsp;y)&nbsp;(+&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;y))&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;seque))</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new; font-weight: bold;">2.34</span><br style="font-family: courier new;"><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(horner-eval&nbsp;x&nbsp;coeff-seque)<br>&nbsp;&nbsp;(accumulate&nbsp;(lambda(this-coeff&nbsp;higher-coeff)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(+&nbsp;this-coeff&nbsp;(*&nbsp;x&nbsp;higher-coeff)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;coeff-seque))</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new; font-weight: bold;">2.35</span><br style="font-family: courier new;"><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(count-leaves+&nbsp;t)<br>&nbsp;&nbsp;(accumulate&nbsp;+&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(map&nbsp;(lambda(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(pair?&nbsp;x)&nbsp;(count-leaves+&nbsp;x)&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t)))</span></div>
<br style="font-family: courier new;"><br></span> <img src ="http://www.cppblog.com/cuigang/aggbug/54420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-06-24 00:21 <a href="http://www.cppblog.com/cuigang/archive/2008/06/24/54420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 我的SICP习题答案（2.27~2.32）</title><link>http://www.cppblog.com/cuigang/archive/2008/06/17/53777.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 17 Jun 2008 15:48:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/06/17/53777.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/53777.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/06/17/53777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/53777.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/53777.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-family: courier new; font-weight: bold;">2.27</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(deep-reverse&nbsp;lst)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;lst-o&nbsp;lst-d)<br>&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((null?&nbsp;lst-o)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst-d)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((not&nbsp;(pair?&nbsp;(car&nbsp;lst-o)))&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(cdr&nbsp;lst-o)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(car&nbsp;lst-o)&nbsp;lst-d)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(cdr&nbsp;lst-o)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(deep-reverse&nbsp;(car&nbsp;lst-o))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst-d)))))<br>&nbsp;&nbsp;(iter&nbsp;lst&nbsp;null))</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new; font-weight: bold;">2.28</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(fringe&nbsp;x)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;tree&nbsp;lst)<br>&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((null?&nbsp;tree)&nbsp;lst)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((not&nbsp;(pair?&nbsp;tree))&nbsp;(cons&nbsp;tree&nbsp;lst))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(iter&nbsp;(car&nbsp;tree)&nbsp;(iter&nbsp;(cdr&nbsp;tree)&nbsp;lst)))))<br>&nbsp;&nbsp;(iter&nbsp;x&nbsp;null))</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new; font-weight: bold;">2.30</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(square-tree-&nbsp;x)<br>&nbsp;&nbsp;(cond&nbsp;((null?&nbsp;x)&nbsp;null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((not&nbsp;(pair?&nbsp;x))&nbsp;(*&nbsp;x&nbsp;x))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(cons&nbsp;(square-tree-&nbsp;(car&nbsp;x))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(square-tree-&nbsp;(cdr&nbsp;x))))))<br>(define&nbsp;(square-tree&nbsp;x)<br>&nbsp;&nbsp;(map&nbsp;(lambda(subtree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(pair?&nbsp;subtree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(square-tree&nbsp;subtree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*&nbsp;subtree&nbsp;subtree)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x))</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new; font-weight: bold;">2.31</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(tree-map&nbsp;proc&nbsp;tree)<br>&nbsp;&nbsp;(map&nbsp;(lambda(subtree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(pair?&nbsp;subtree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tree-map&nbsp;proc&nbsp;subtree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(proc&nbsp;subtree)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree))<br>(define&nbsp;(square-tree+&nbsp;tree)<br>&nbsp;&nbsp;(tree-map&nbsp;(lambda(x)&nbsp;(*&nbsp;x&nbsp;x))&nbsp;tree))</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new; font-weight: bold;">2.32</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(subsets&nbsp;s)<br>&nbsp;&nbsp;(if&nbsp;(null?&nbsp;s)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((rest&nbsp;(subsets&nbsp;(cdr&nbsp;s))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(append&nbsp;rest&nbsp;(map&nbsp;(lambda(x)&nbsp;(cons&nbsp;(car&nbsp;s)&nbsp;x))&nbsp;rest)))))</span></div>
<span style="font-family: courier new;"><br>和换零钱问题的思路是一样的，对于一个集合的所有子集的集合，可以分为两部分，含有第一个元素和不含第一个元素的集合。而且含第一个元素的所有子集除去第一个元素，恰好正是所有不含第一个元素的子集。</span><br style="font-family: courier new;"><span style="font-family: courier new;">也可以换个思路，对于集合A，设它可以表示为 (a1)&#8746;(a2,...,an) ，而 (a2,...,an) 的所有子集的集合是 B=(B1,...Bm),那么可以证明A的所有子集的集合 C=B&#8746;((A1)&#8746;B1,(A1)&#8746;B2,...,(A1)&#8746;Bm);<br>证明：设 X 是 A 的一个子集，那么如果 a1&#8712;X，那么 X</span></span><span style="font-size: 10pt;"><span style="font-family: courier new;">&#8712;</span></span><span style="font-size: 10pt;"><span style="font-family: courier new;">((A1)&#8746;B1,(A1)&#8746;B2,...,(A1)&#8746;Bm)，否则</span></span><span style="font-size: 10pt;"><span style="font-family: courier new;">X</span></span><span style="font-size: 10pt;"><span style="font-family: courier new;">&#8712;B，所以<br>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt;"><span style="font-family: courier new;">X</span></span><span style="font-size: 10pt;"><span style="font-family: courier new;">&#8712;C<br><br style="font-family: courier new;"></span></span><span style="font-size: 10pt;"><span style="font-family: courier new;"></span><br style="font-family: courier new;"><br></span> <img src ="http://www.cppblog.com/cuigang/aggbug/53777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-06-17 23:48 <a href="http://www.cppblog.com/cuigang/archive/2008/06/17/53777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 我的SICP习题答案（2.24~2.26）</title><link>http://www.cppblog.com/cuigang/archive/2008/06/11/52948.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Wed, 11 Jun 2008 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/06/11/52948.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/52948.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/06/11/52948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/52948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/52948.html</trackback:ping><description><![CDATA[<span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; FONT-FAMILY: courier new">2.24</span><br><br><img height=146 alt="" src="http://www.cppblog.com/images/cppblog_com/cuigang/1.gif" width=391><br><br><span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; FONT-FAMILY: courier new">2.25</span><br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="FONT-SIZE: 10pt; COLOR: #000000">(car&nbsp;(cdaddr&nbsp;(list&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;(list&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">)))<br>(caar&nbsp;(list&nbsp;(list&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">)))<br>(cadadr&nbsp;(cadadr(cadadr&nbsp;(list&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;(list&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;(list&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;(list&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;(list&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">&nbsp;(list&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">)))))))))</span></div>
<span style="FONT-SIZE: 10pt"><br style="FONT-WEIGHT: bold; FONT-FAMILY: courier new"><span style="FONT-SIZE: 10pt; FONT-FAMILY: courier new"><span style="FONT-WEIGHT: bold">2.26</span><br><br style="FONT-FAMILY: courier new">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">)<br>((</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">)<br>((</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)&nbsp;(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">))</span></div>
<br><br><br><br></span></span><span style="FONT-FAMILY: courier new"></span>
<img src ="http://www.cppblog.com/cuigang/aggbug/52948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-06-11 23:39 <a href="http://www.cppblog.com/cuigang/archive/2008/06/11/52948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 我的SICP习题答案（2.17~2.23）</title><link>http://www.cppblog.com/cuigang/archive/2008/06/11/52942.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Wed, 11 Jun 2008 14:56:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/06/11/52942.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/52942.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/06/11/52942.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/52942.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/52942.html</trackback:ping><description><![CDATA[<span style="font-family: courier new; font-size: 10pt; font-weight: bold;">2.17</span><br style="font-family: courier new;"><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: Comic Sans MS; color: #000000;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="font-family: courier new;">(define&nbsp;(last-pair&nbsp;lst)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;(if&nbsp;(null?&nbsp;(cdr&nbsp;lst))</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(car&nbsp;lst)&nbsp;())</span><br><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(last-pair&nbsp;(cdr&nbsp;lst))))</span></div>
<span style="font-size: 10pt;"><br style="font-family: courier new;"><span style="font-weight: bold;">2.18</span></span><br style="font-family: courier new;"><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: Comic Sans MS; color: #000000;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="font-family: courier new;">(define&nbsp;(reverse&nbsp;lst)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;(define&nbsp;(iter&nbsp;lst-o&nbsp;lst-d)</span><br><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(null?&nbsp;lst-o)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst-d</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(cdr&nbsp;lst-o)&nbsp;(cons&nbsp;(car&nbsp;lst-o)&nbsp;lst-d))))</span><br><span style="font-family: courier new; font-size: 10pt;">&nbsp;&nbsp;(iter&nbsp;lst&nbsp;null))</span></div>
<br style="font-family: Comic Sans MS; font-weight: bold;"><span style="font-family: courier new; font-size: 10pt; font-weight: bold;">2.20</span><br style="font-family: Comic Sans MS;"><br style="font-family: Comic Sans MS;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: Comic Sans MS; color: #000000;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="font-family: courier new; font-size: 10pt;">(define&nbsp;(same-parity&nbsp;x&nbsp;.&nbsp;lst)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;(define&nbsp;(filter&nbsp;lst&nbsp;ok?)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(null?&nbsp;lst)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;()</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(ok?&nbsp;(car&nbsp;lst))</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(car&nbsp;lst)&nbsp;(filter&nbsp;(cdr&nbsp;lst)&nbsp;ok?))</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(filter&nbsp;(cdr&nbsp;lst)&nbsp;ok?))))</span><br><span style="font-family: courier new; font-size: 10pt;">&nbsp;&nbsp;(if&nbsp;(even?&nbsp;x)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;x&nbsp;(filter&nbsp;lst&nbsp;(lambda(x)&nbsp;(=&nbsp;0&nbsp;(remainder&nbsp;x&nbsp;2)))))</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;x&nbsp;(filter&nbsp;lst&nbsp;(lambda(x)&nbsp;(=&nbsp;1&nbsp;(remainder&nbsp;x&nbsp;2)))))))</span></div>
<br style="font-family: Comic Sans MS;"><span style="font-family: courier new; font-size: 10pt; font-weight: bold;">
2.21</span><br style="font-family: Comic Sans MS;">
<br style="font-family: Comic Sans MS;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: Comic Sans MS; color: #000000;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="font-size: 10pt;"><span style="font-family: courier new;">(define&nbsp;(square-list-&nbsp;items)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;(if&nbsp;(null?&nbsp;items)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;()</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(*&nbsp;(car&nbsp;items)&nbsp;(car&nbsp;items))</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(square-list-&nbsp;(cdr&nbsp;items)))))</span><br><br style="font-family: courier new;"><span style="font-family: courier new;">(define&nbsp;(square-list&nbsp;items)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;(map&nbsp;(lambda(x)&nbsp;(*&nbsp;x&nbsp;x))&nbsp;items))</span></span></div>
<span style="font-size: 10pt;"><br style="font-family: courier new;"><span style="font-family: courier new; font-weight: bold;">
2.22</span><br style="font-family: courier new;">
<br style="font-family: courier new;"><span style="font-family: courier new;">
第一种每次取出首元素平方后前插到新表，象reverse过程类似，所以是反的。</span><br style="font-family: courier new;"><span style="font-family: courier new;">第二种只不过是把新表前插到元素前，得到的甚至不是一个list，而是</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp; ((((() . 1) . 4) . 9) . 16)
</span><br style="font-family: courier new;">
<br style="font-family: courier new;"><span style="font-family: courier new; font-weight: bold;">
2.23</span><br style="font-family: courier new;">
</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: Comic Sans MS; color: #000000;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="font-family: courier new;">(define&nbsp;(for-each&nbsp;proc&nbsp;items)</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;(if&nbsp;(not&nbsp;(null?&nbsp;items))</span><br><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((lambda()&nbsp;(proc&nbsp;(car&nbsp;items))</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(for-each&nbsp;proc&nbsp;(cdr&nbsp;items))))))</span></div>
<br>  <img src ="http://www.cppblog.com/cuigang/aggbug/52942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-06-11 22:56 <a href="http://www.cppblog.com/cuigang/archive/2008/06/11/52942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 我的SICP习题答案（2.01~2.08）</title><link>http://www.cppblog.com/cuigang/archive/2008/06/10/52803.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 10 Jun 2008 14:01:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/06/10/52803.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/52803.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/06/10/52803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/52803.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/52803.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: courier new;"><br><span style="font-weight: bold;">
2.01</span><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-rat&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(let&nbsp;((g&nbsp;(gcd&nbsp;x&nbsp;y)))<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(&lt;&nbsp;y&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(/&nbsp;(-&nbsp;x)&nbsp;g)&nbsp;(/&nbsp;(-&nbsp;y)&nbsp;g))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(/&nbsp;x&nbsp;g)&nbsp;(/&nbsp;y&nbsp;g)))))&nbsp;</span></div>
<br><span style="font-weight: bold;">
2.02</span><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-point&nbsp;x&nbsp;y)&nbsp;(cons&nbsp;x&nbsp;y))<br>(define&nbsp;(x-point&nbsp;p)&nbsp;(car&nbsp;p))<br>(define&nbsp;(y-point&nbsp;p)&nbsp;(cdr&nbsp;p))<br><br>(define&nbsp;(make-segment&nbsp;p1&nbsp;p2)&nbsp;(cons&nbsp;p1&nbsp;p2))<br>(define&nbsp;(start-seg&nbsp;line)&nbsp;(car&nbsp;line))<br>(define&nbsp;(end-seg&nbsp;line)&nbsp;(cdr&nbsp;line))<br><br>(define&nbsp;(midpoint-segment&nbsp;line)<br>&nbsp;&nbsp;(make-point&nbsp;(/&nbsp;(+&nbsp;(x-point&nbsp;(start-seg&nbsp;line))&nbsp;(x-point&nbsp;(end-seg&nbsp;line)))&nbsp;</span><span style="color: #000000;">2.0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(/&nbsp;(+&nbsp;(y-point&nbsp;(start-seg&nbsp;line))&nbsp;(y-point&nbsp;(end-seg&nbsp;line)))&nbsp;</span><span style="color: #000000;">2.0</span><span style="color: #000000;">)))&nbsp;</span></div>
<br><span style="font-weight: bold;">
2.04</span><br>
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;"></span><span style="color: #008000;">;</span><span style="color: #008000;">;;;;;;;;;;;;;;;;;;;;;;;;</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&nbsp;(cdr+&nbsp;(cons+&nbsp;x&nbsp;y)&nbsp;=&nbsp;((cons+&nbsp;x&nbsp;y)&nbsp;(lambda(p&nbsp;q)&nbsp;p)))</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(lambda(m)(m&nbsp;x&nbsp;y)&nbsp;(lambda(p&nbsp;q)&nbsp;p)))</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;((lambda(p&nbsp;q)&nbsp;p)&nbsp;x&nbsp;y)</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;x</span><span style="color: #008000;"><br></span><span style="color: #000000;">(define&nbsp;(cons+&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(lambda(m)&nbsp;(m&nbsp;x&nbsp;y)))<br>(define&nbsp;(car+&nbsp;z)<br>&nbsp;&nbsp;(z&nbsp;(lambda(p&nbsp;q)&nbsp;p)))<br>(define&nbsp;(cdr+&nbsp;z)<br>&nbsp;&nbsp;(z&nbsp;(lambda(p&nbsp;q)&nbsp;q)))&nbsp;</span></div>
<br><span style="font-weight: bold;">
2.05</span><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: #000000;">2</span><span style="color: #000000;">^a&nbsp;*&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">^b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">^c&nbsp;*&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">^d&nbsp;(a!</span><span style="color: #000000;">=</span><span style="color: #000000;">c&nbsp;&amp;&amp;&nbsp;b!</span><span style="color: #000000;">=</span><span style="color: #000000;">d)<br>&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">^a/</span><span style="color: #000000;">2</span><span style="color: #000000;">^c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">^d/</span><span style="color: #000000;">3</span><span style="color: #000000;">^b<br>&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">^(a-c)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">^(d-b)<br>&nbsp;&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">c&nbsp;&amp;&amp;&nbsp;d</span><span style="color: #000000;">=</span><span style="color: #000000;">b</span></div>
<br><span style="font-weight: bold;">
2.06</span><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;one&nbsp;(lambda(f)&nbsp;(lambda(x)&nbsp;(f&nbsp;x))))<br>(define&nbsp;two&nbsp;(lambda(f)&nbsp;(lambda(x)&nbsp;(f&nbsp;(f&nbsp;x)))))&nbsp;</span></div>
<br><span style="font-weight: bold;">
2.07</span><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;(upper-bound&nbsp;pair)<br>&nbsp;&nbsp;(if&nbsp;(&gt;&nbsp;(car&nbsp;pair)&nbsp;(cdr&nbsp;pair))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(car&nbsp;pair)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cdr&nbsp;pair)))<br>(define&nbsp;(lower-bound&nbsp;pair)<br>&nbsp;&nbsp;(if&nbsp;(&gt;&nbsp;(car&nbsp;pair)&nbsp;(cdr&nbsp;pair))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cdr&nbsp;pair)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(car&nbsp;pair)))&nbsp;</span></div>
<br><span style="font-weight: bold;">
2.08</span><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;(sub-interval&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(add-interval&nbsp;x&nbsp;(make-interval&nbsp;(-&nbsp;(upper-bound&nbsp;y))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&nbsp;(lower-bound&nbsp;y)))))&nbsp;</span></div>
<br> </span><img src ="http://www.cppblog.com/cuigang/aggbug/52803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-06-10 22:01 <a href="http://www.cppblog.com/cuigang/archive/2008/06/10/52803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 我的SICP习题答案（1.40~1.44）</title><link>http://www.cppblog.com/cuigang/archive/2008/04/19/47632.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Sat, 19 Apr 2008 15:49:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/04/19/47632.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/47632.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/04/19/47632.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/47632.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/47632.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">;</span><span style="color: #008000;">;;;;;;;;;;</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">1.43</span><span style="color: #008000;"><br></span><span style="color: #000000;">(define&nbsp;(double&nbsp;f)<br>&nbsp;&nbsp;(lambda(x)&nbsp;(f&nbsp;(f&nbsp;x))))<br></span><span style="color: #008000;">;</span><span style="color: #008000;">;(((double&nbsp;(double&nbsp;double))&nbsp;inc)&nbsp;5)&nbsp;=&nbsp;5+16&nbsp;=21</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #008000;">;</span><span style="color: #008000;">;;;;;;;;;;;;</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">1.42</span><span style="color: #008000;"><br></span><span style="color: #000000;">(define&nbsp;(compose&nbsp;f&nbsp;g)<br>&nbsp;&nbsp;(lambda(x)&nbsp;(f&nbsp;(g&nbsp;x))))<br><br></span><span style="color: #008000;">;</span><span style="color: #008000;">;;;;;;;;;;;;;;</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">1.43</span><span style="color: #008000;"><br></span><span style="color: #000000;">(define&nbsp;(repeated&nbsp;f&nbsp;n)<br>&nbsp;&nbsp;(if(</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;f<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(compose&nbsp;f&nbsp;(repeated&nbsp;f&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)))))<br><br></span><span style="color: #008000;">;</span><span style="color: #008000;">;;;;;;;;;;;;;;;</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">1.44</span><span style="color: #008000;"><br></span><span style="color: #000000;">(define&nbsp;(smooth&nbsp;f)<br>&nbsp;&nbsp;(lambda(x)&nbsp;(/&nbsp;(+&nbsp;(f&nbsp;(-&nbsp;x&nbsp;dx))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f&nbsp;x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f&nbsp;(+&nbsp;x&nbsp;dx)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)))<br><span style="color: #c4c3bd;">(define&nbsp;(smooth-n&nbsp;f)</span><br style="color: #c4c3bd;"><span style="color: #c4c3bd;">&nbsp;&nbsp;(repeated&nbsp;f&nbsp;n))</span><br>(define (smooth-n f n)<br>&nbsp; ((repeated smooth n) f))
<br><br></span></div>
<br style="font-family: courier new;"> <img src ="http://www.cppblog.com/cuigang/aggbug/47632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-04-19 23:49 <a href="http://www.cppblog.com/cuigang/archive/2008/04/19/47632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.35~1.39）</title><link>http://www.cppblog.com/cuigang/archive/2008/04/16/47169.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 15 Apr 2008 16:22:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/04/16/47169.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/47169.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/04/16/47169.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/47169.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/47169.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 8pt;"><span style="font-weight: bold; font-size: 10pt;">1.35<br><br></span></span><span style="font-size: 10pt;"><span style="font-family: courier new;"><span style="font-family: courier new;"></span>若&nbsp;&#966;=0&nbsp;，&nbsp;则&nbsp;&#966;^2=&#966;+1&nbsp;不成立&nbsp;，&nbsp;故&nbsp;&#966;&#8800;0<br>&#966;^2&nbsp;=&nbsp;&#966;+1&nbsp;==&gt;<br>&#966;&nbsp;=&nbsp;(&#966;+1)/&#966;&nbsp;=&nbsp;1&nbsp;+&nbsp;(1/&#966;)
<br></span><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="font-size: 10pt; font-family: courier new;">(fixed-point&nbsp;(lambda(x)&nbsp;(+&nbsp;1&nbsp;(/&nbsp;1&nbsp;x)))&nbsp;1.0)</span></div>
<br><span style="font-weight: bold; font-size: 10pt;">1.36</span><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; font-family: courier new; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="font-size: 10pt; color: #000000;">(define&nbsp;tolerance&nbsp;</span><span style="color: #000000;">0.00001</span><span style="font-size: 10pt; color: #000000;">)<br><br>(define&nbsp;(fixed-point&nbsp;f&nbsp;first-guess)<br>&nbsp;&nbsp;(define&nbsp;(close-enough?&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;&nbsp;&nbsp;(&lt;&nbsp;(abs&nbsp;(-&nbsp;x&nbsp;y))&nbsp;tolerance))<br>&nbsp;&nbsp;(define&nbsp;(try&nbsp;guess)<br>&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((next&nbsp;(f&nbsp;guess)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(display&nbsp;next)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(newline)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(close-enough?&nbsp;guess&nbsp;next)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(try&nbsp;next))))<br>&nbsp;&nbsp;(try&nbsp;first-guess))</span></div>
<br>平均阻尼法和不用平均阻尼分别如下，它们步数分别为 9 和 34 。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; font-family: courier new; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="font-size: 10pt; color: #000000;">(fixed-point&nbsp;(lambda(x)&nbsp;(/&nbsp;(+&nbsp;x&nbsp;(/&nbsp;(log&nbsp;</span><span style="color: #000000;">1000</span><span style="color: #000000;">)&nbsp;(log&nbsp;x)))&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">2.0</span><span style="color: #000000;">)<br>(fixed-point&nbsp;(lambda(x)&nbsp;(/&nbsp;(log&nbsp;</span><span style="color: #000000;">1000</span><span style="color: #000000;">)&nbsp;(log&nbsp;x)))&nbsp;</span><span style="color: #000000;">2.0</span><span style="color: #000000;">)</span></div>
<br><span style="font-weight: bold;">1.37</span><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(cont-frac-r&nbsp;n&nbsp;d&nbsp;k)<br>&nbsp;&nbsp;(define&nbsp;(redu&nbsp;i)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i&nbsp;k)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(/&nbsp;(n&nbsp;i)&nbsp;(d&nbsp;i))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(/&nbsp;(n&nbsp;i)&nbsp;(+&nbsp;(d&nbsp;i)&nbsp;(redu&nbsp;n&nbsp;d&nbsp;(+&nbsp;i&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))))))<br>&nbsp;&nbsp;(redu&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br><br>(define&nbsp;(cont-frac&nbsp;n&nbsp;d&nbsp;k)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;i&nbsp;result)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(-&nbsp;i&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;(/&nbsp;(n&nbsp;i)&nbsp;(+&nbsp;(d&nbsp;i)&nbsp;result)))))<br>&nbsp;&nbsp;(iter&nbsp;k&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))<br><br>(define&nbsp;(get-phai&nbsp;k)<br>&nbsp;&nbsp;(/&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(cont-frac&nbsp;(lambda(i)&nbsp;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">)&nbsp;(lambda(i)&nbsp;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">)&nbsp;k)))<br><br>(define&nbsp;(get-k)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;i)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(&lt;&nbsp;(abs&nbsp;(-&nbsp;(get-phai&nbsp;i)&nbsp;</span><span style="color: #000000;">1.6180</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">0.00005</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(+&nbsp;i&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))))<br>&nbsp;&nbsp;(iter&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))</span></div>
<br>k = 11 时，精度满足 4 位 十进制数。<br><br><span style="font-weight: bold;">1.38</span><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(euler-d&nbsp;i)<br>&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">2.0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((and&nbsp;(&gt;&nbsp;i&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(remainder&nbsp;(-&nbsp;i&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*&nbsp;(/&nbsp;(+&nbsp;i&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">3.0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">2.0</span><span style="color: #000000;">))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">)))<br><br>(define&nbsp;(get-e&nbsp;k)<br>&nbsp;&nbsp;(+&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;(cont-frac&nbsp;(lambda(i)&nbsp;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">)&nbsp;euler-d&nbsp;k)))</span></div>
<br><span style="font-weight: bold;">1.39</span><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(tan-cf&nbsp;x&nbsp;k)<br>&nbsp;&nbsp;(define&nbsp;(tan-n&nbsp;i)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&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;x<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&nbsp;(*&nbsp;x&nbsp;x))))<br>&nbsp;&nbsp;(cont-frac&nbsp;tan-n&nbsp;(lambda(i)&nbsp;(-&nbsp;(*&nbsp;i&nbsp;</span><span style="color: #000000;">2.0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">))&nbsp;k))</span></div>
<br></span></span><img src ="http://www.cppblog.com/cuigang/aggbug/47169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-04-16 00:22 <a href="http://www.cppblog.com/cuigang/archive/2008/04/16/47169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.34）</title><link>http://www.cppblog.com/cuigang/archive/2008/04/06/46378.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Sun, 06 Apr 2008 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/04/06/46378.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/46378.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/04/06/46378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/46378.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/46378.html</trackback:ping><description><![CDATA[<span style="font-size: 8pt;"><span style="font-family: courier new;">这个展开过程为：<br><br style="font-family: courier new;"></span><span style="font-family: courier new;">(f f)</span><br style="font-family: courier new;"><span style="font-family: courier new;">(f 2)</span><br style="font-family: courier new;"><span style="font-family: courier new;">(2 2)<br><br style="font-family: courier new;"></span><span style="font-family: courier new;">解释器将报错，&#8216;2&#8217;是一个未定义过程。</span><br style="font-family: courier new;"><br></span><img src ="http://www.cppblog.com/cuigang/aggbug/46378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-04-06 16:46 <a href="http://www.cppblog.com/cuigang/archive/2008/04/06/46378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.29~1.33）</title><link>http://www.cppblog.com/cuigang/archive/2008/04/06/46375.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Sun, 06 Apr 2008 08:12:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/04/06/46375.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/46375.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/04/06/46375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/46375.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/46375.html</trackback:ping><description><![CDATA[<span style="font-size: 8pt; font-family: courier new;"><span style="font-weight: bold;">1.29</span><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;(simpson&nbsp;f&nbsp;a&nbsp;b&nbsp;n)<br>&nbsp;&nbsp;(define&nbsp;(get-h)&nbsp;(/&nbsp;(-&nbsp;b&nbsp;a)&nbsp;n))<br>&nbsp;&nbsp;(define&nbsp;(get-y&nbsp;k)&nbsp;(f&nbsp;(+&nbsp;a&nbsp;(*&nbsp;k&nbsp;(get-h)))))<br>&nbsp;&nbsp;(define&nbsp;(simpson-term&nbsp;k)<br>&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;k&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;(get-y&nbsp;k))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;k&nbsp;n)&nbsp;(get-y&nbsp;k))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(remainder&nbsp;k&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;(*&nbsp;</span><span style="color: #000000;">2.0</span><span style="color: #000000;">&nbsp;(get-y&nbsp;k)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(*&nbsp;</span><span style="color: #000000;">4.0</span><span style="color: #000000;">&nbsp;(get-y&nbsp;k)))))<br>&nbsp;&nbsp;(define&nbsp;(simpson-next&nbsp;k)&nbsp;(+&nbsp;k&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br>&nbsp;&nbsp;(*&nbsp;(/&nbsp;(get-h)&nbsp;</span><span style="color: #000000;">3.0</span><span style="color: #000000;">)&nbsp;(sum&nbsp;simpson-term&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;simpson-next&nbsp;n)))&nbsp;</span></div>
<br><span style="font-weight: bold;">1.30</span><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;(sum&nbsp;term&nbsp;a&nbsp;next&nbsp;b)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;a&nbsp;result)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(&gt;&nbsp;a&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(next&nbsp;a)&nbsp;(+&nbsp;(term&nbsp;a)&nbsp;result))))<br>&nbsp;&nbsp;(iter&nbsp;a&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))</span></div>
<br><span style="font-weight: bold;">1.31</span><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: #008000; font-size: 8pt;">;</span><span style="color: #008000;">;递归</span><span style="color: #008000;"><br></span><span style="color: #000000;">(define&nbsp;(product-re&nbsp;term&nbsp;a&nbsp;next&nbsp;b)<br>&nbsp;&nbsp;(if&nbsp;(&gt;&nbsp;a&nbsp;b)<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;(*&nbsp;(term&nbsp;a)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(product-re&nbsp;term&nbsp;(next&nbsp;a)&nbsp;next&nbsp;b))))<br></span><span style="color: #008000;">;</span><span style="color: #008000;">;迭代</span><span style="color: #008000;"><br></span><span style="color: #000000;">(define&nbsp;(product&nbsp;term&nbsp;a&nbsp;next&nbsp;b)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;a&nbsp;result)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(&gt;&nbsp;a&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(next&nbsp;a)&nbsp;(*&nbsp;result&nbsp;(term&nbsp;a)))))<br>&nbsp;&nbsp;(iter&nbsp;a&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br><br>(define&nbsp;(pi-product&nbsp;b)<br>&nbsp;&nbsp;(define&nbsp;(pi-term&nbsp;k)&nbsp;(/&nbsp;(*&nbsp;(-&nbsp;k&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;(+&nbsp;k&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))&nbsp;k&nbsp;k))<br>&nbsp;&nbsp;(define&nbsp;(pi-next&nbsp;k)&nbsp;(+&nbsp;k&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">))<br>&nbsp;&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">;(*&nbsp;4.0&nbsp;(product-re&nbsp;pi-term&nbsp;3.0&nbsp;pi-next&nbsp;b)))&nbsp;;;递归</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;(*&nbsp;</span><span style="color: #000000;">4.0</span><span style="color: #000000;">&nbsp;(product&nbsp;pi-term&nbsp;</span><span style="color: #000000;">3.0</span><span style="color: #000000;">&nbsp;pi-next&nbsp;b)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">;迭代</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span></div>
<br><span style="font-weight: bold;">1.32</span><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;(sum&nbsp;term&nbsp;a&nbsp;next&nbsp;b)<br>&nbsp;&nbsp;(accumulate&nbsp;+&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;term&nbsp;a&nbsp;next&nbsp;b))<br><br>(define&nbsp;(product&nbsp;term&nbsp;a&nbsp;next&nbsp;b)<br>&nbsp;&nbsp;(accumulate&nbsp;*&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;term&nbsp;a&nbsp;next&nbsp;b))<br><br></span><span style="color: #008000;">;</span><span style="color: #008000;">;递归</span><span style="color: #008000;"><br></span><span style="color: #000000;">(define&nbsp;(accumulate-re&nbsp;combiner&nbsp;null-value&nbsp;term&nbsp;a&nbsp;next&nbsp;b)<br>&nbsp;&nbsp;(if&nbsp;(&gt;&nbsp;a&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;null-value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(combiner&nbsp;(term&nbsp;a)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(accumulate-re&nbsp;combiner&nbsp;null-value&nbsp;term&nbsp;(next&nbsp;a)&nbsp;next&nbsp;b))))<br><br></span><span style="color: #008000;">;</span><span style="color: #008000;">;迭代</span><span style="color: #008000;"><br></span><span style="color: #000000;">(define&nbsp;(accumulate&nbsp;combiner&nbsp;null-value&nbsp;term&nbsp;a&nbsp;next&nbsp;b)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;a&nbsp;result)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(&gt;&nbsp;a&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(next&nbsp;a)&nbsp;(combiner&nbsp;(term&nbsp;a)&nbsp;result))))<br>&nbsp;&nbsp;(iter&nbsp;a&nbsp;null-value))<br></span></div>
<br><span style="font-weight: bold;">1.33</span><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;(filtered-accumulate&nbsp;combiner&nbsp;null-value&nbsp;term&nbsp;a&nbsp;next&nbsp;b&nbsp;filter?)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;a&nbsp;result)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(&gt;&nbsp;a&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(filter?&nbsp;(term&nbsp;a))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(next&nbsp;a)&nbsp;(combiner&nbsp;(term&nbsp;a)&nbsp;result))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(next&nbsp;a)&nbsp;result))))<br>&nbsp;&nbsp;(iter&nbsp;a&nbsp;null-value))<br><br>(define&nbsp;(sum-prime&nbsp;a&nbsp;b)<br>&nbsp;&nbsp;(define&nbsp;(sum-prime-term&nbsp;k)&nbsp;k)<br>&nbsp;&nbsp;(define&nbsp;(sum-prime-next&nbsp;k)&nbsp;(+&nbsp;k&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br>&nbsp;&nbsp;(filtered-accumulate&nbsp;+&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;sum-prime-term&nbsp;a&nbsp;sum-prime-next&nbsp;b&nbsp;prime?))<br><br>(define&nbsp;(relatively-prime-product&nbsp;n)<br>&nbsp;&nbsp;(define&nbsp;(relatively-prime?&nbsp;k)&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(gcd&nbsp;k&nbsp;n)&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br>&nbsp;&nbsp;(define&nbsp;(term&nbsp;k)&nbsp;k)<br>&nbsp;&nbsp;(define&nbsp;(next&nbsp;k)&nbsp;(+&nbsp;k&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br>&nbsp;&nbsp;(filtered-accumulate&nbsp;*&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;term&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;next&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;relatively-prime?))</span></div>
<br><br><br></span><img src ="http://www.cppblog.com/cuigang/aggbug/46375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-04-06 16:12 <a href="http://www.cppblog.com/cuigang/archive/2008/04/06/46375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.24~1.28）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/31/45781.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Sun, 30 Mar 2008 16:21:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/31/45781.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/45781.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/31/45781.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/45781.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/45781.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-size: 8pt;"><span style="font-family: courier new; font-weight: bold;">1.24</span><br style="font-family: courier new;"><span style="font-family: courier new; font-size: 10pt;">对于Fermat检查，因为具有log n 的增长阶，所以对于 n^2 和 n 的检查的时间比 理论上应该是 2：1， 实际上，经过测试也比较接近，当n比较大时。<br>若与预计不符，可能因为 n 比较小，或者字长发生变化，比如 n &gt; 2^32 （参见下题）<br><br><span style="font-weight: bold;">1.25</span><br>仅从理论分析，Alyssa 的改动不会引起增长阶的变化，但实际上当 Fermat 检查的 n 稍微大一点，速度就会很慢。主要原因 就是 base^exp 是一个非常大的数，可能远远超过 一个32位机字的表示范围 2^32 ，在 scheme 里可能用若干个 32-bit 靠软件实现运算，这将导致计算急速增长。无论是传递、运算还是求模。<br>实际上 1.22、1.23、1.24 的几个题目可能都会遇到字长变化引起的计算速度突变。<br><br><span style="font-weight: bold;">1.26</span><br>Fermat 检查正是因为 连续求平方的求幂方法，使得的增长阶变为 log n， 而这均来源于 b^(2n) = (b^n)^2，</span></span><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;">Louis 的方法让求幂又变成了连乘，b^(2n) = b^n*b^n = (b*b*...*b)*(b*b*...*b)，求幂的增长阶变成了 O(n)，Fermat 检查的增长阶自然也变成了 O(n)。<br><br><span style="font-weight: bold;">1.27</span><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; font-size: 10pt;">(define&nbsp;(fermat-test&nbsp;n)<br>&nbsp;&nbsp;(fermat-iter&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;n))<br><br>(define&nbsp;(fermat-iter&nbsp;a&nbsp;n)<br>&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;#t)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(expmod&nbsp;a&nbsp;n&nbsp;n)&nbsp;a)&nbsp;(fermat-iter&nbsp;(-&nbsp;a&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;n))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;#f)))</span></div>
<br><span style="font-weight: bold;">1.28</span><br>首先来看，Fermat 小定理的一个变形：<br><br>p 是素数, 1&lt;a&lt;p, 有 a^p % p = a<br>==&gt; a^p = kp + a ==&gt; a^p - a = kp ==&gt; a(a^(p-1)-1) = kp ==&gt; a^(p-1) -1 = k'p<br>==&gt; a^(p-1) % p = 1<br><br>这个变形就是题目中提到的，这个形式和费马小定理是等价的（但是奇怪的是，我没有发现已知的几个Carmichael数能够躲过这个变形的检查，有待研究<span style="color: #eec859; font-weight: bold;">①</span>）<br><br>再来看，miller-rabin 素性测试的原理：<br><br>p 是素数， 1&lt;a&lt;p, 且 a^2 % p = 1<br>==&gt; (a^2-1) % p = 0 ==&gt; (a+1)(a-1) % p =0<br>那么 a+1 % p = 0 或者 a-1 % p =0,<br>又 a&lt;p 且 p 是素数，所以<br>a = 1 或者 a = p-1 （这两个叫做 1模n的平凡平方根）<br></span></span></span><span style="font-size: 10pt;"><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;"></span></span></span><br><span style="font-size: 10pt;"><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;"></span></span><span style="font-size: 8pt;">代码如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000; font-size: 10pt; font-family: courier new;">(define&nbsp;(check-nontrivial-sqrt-of-one&nbsp;a&nbsp;n)<br>&nbsp;&nbsp;(define&nbsp;(check-</span><span style="color: #000000; font-family: courier new;">1?&nbsp;t)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(and&nbsp;(&gt;&nbsp;a&nbsp;1</span><span style="color: #000000;"><span style="font-family: courier new;">)</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&lt;&nbsp;a&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<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;t&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: #000000;">0</span><span style="color: #000000;">&nbsp;t))<br>&nbsp;&nbsp;(check-</span><span style="color: #000000;">1</span><span style="color: #000000;">?&nbsp;(remainder&nbsp;(square&nbsp;a)&nbsp;n)))<br><br>(define&nbsp;(expmod&nbsp;base&nbsp;exp&nbsp;m)<br>&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;exp&nbsp;</span><span style="color: #000000;">0</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;((even?&nbsp;exp)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">(remainder&nbsp;(square&nbsp;(expmod&nbsp;base&nbsp;(/&nbsp;exp&nbsp;2)&nbsp;m))&nbsp;m))</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(check-nontrivial-sqrt-of-one&nbsp;(expmod&nbsp;base&nbsp;(/&nbsp;exp&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;m)&nbsp;m))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(remainder&nbsp;(*&nbsp;base&nbsp;(expmod&nbsp;base&nbsp;(-&nbsp;exp&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;m))&nbsp;m))))<br><br>(define&nbsp;(miller-rabin-test&nbsp;n)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;x&nbsp;n)<br>&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;#t)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(expmod&nbsp;x&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;n)&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;(iter&nbsp;(-&nbsp;x&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;n))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;#f)))<br>&nbsp;&nbsp;(iter&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;n))</span></div>
<br><span style="color: #eec859; font-weight: bold;">① 对于 </span></span></span><span style="font-size: 10pt; color: #eec859; font-weight: bold;"><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;">Carmichael 数 n ，实际上不能完全通过 </span></span><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;"></span></span></span><span style="font-size: 10pt; color: #eec859;"><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;"><span style="font-weight: bold;">a^(n-1)%n = 1 的检查</span></span></span></span><span style="font-size: 10pt; color: #eec859; font-weight: bold;"><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;">，除非 a 与 n 互素，当 a 为 n 的素因子时，不能通过，比如 </span></span><span style="font-size: 8pt;"></span><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;">Carmichael 第一个 561 = 3*11*17， 而 3^560%561 = 375 &#8800; 1 。可以程序验证这个。 所以我认为，</span></span><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;">a^(n-1)%n = 1 的检查比 a^n%n = a 的检查更严格，是不是不存在合数通过完全的 </span></span></span><span style="font-size: 10pt;"><span style="font-size: 8pt;"><span style="font-family: courier new; font-size: 10pt;"><span style="color: #3925c6; font-weight: bold;"><span style="color: #eec859;">a^(n-1)%n = 1 的检查呢？我不敢说。但把这个结论暂时记在这里，希望能得到帮助或者反驳。2008-04-02 23:56</span><br><br></span><br></span></span></span>  <img src ="http://www.cppblog.com/cuigang/aggbug/45781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-31 00:21 <a href="http://www.cppblog.com/cuigang/archive/2008/03/31/45781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.21~1.23）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/28/45648.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Fri, 28 Mar 2008 15:44:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/28/45648.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/45648.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/28/45648.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/45648.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/45648.html</trackback:ping><description><![CDATA[<span style="font-size: 8pt; font-family: courier new;"><span style="font-size: 8pt;"><span style="font-weight: bold; font-size: 8pt;">1.21<br><br></span><span style="font-size: 8pt; font-family: courier new;">
<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;">&gt;&nbsp;(smallest-divisor&nbsp;</span><span style="color: #000000;">199</span><span style="color: #000000;">)<br></span><span style="color: #000000;">199</span><span style="color: #000000;"><br>&gt;&nbsp;(smallest-divisor&nbsp;</span><span style="color: #000000;">1999</span><span style="color: #000000;">)<br></span><span style="color: #000000;">1999</span><span style="color: #000000;"><br>&gt;&nbsp;(smallest-divisor&nbsp;</span><span style="color: #000000;">19999</span><span style="color: #000000;">)<br></span><span style="color: #000000;">7</span><span style="color: #000000;"><br>&gt;</span></div>
</span><span style="font-weight: bold; font-size: 8pt;"><br></span><span style="font-weight: bold;">1.22</span><br>在 DrScheme 中没有对应的 runtime 过程，我们用内建的 current-milliseconds
来代替，这个过程返回的是系统的 ms 数。<br>同时，在 Windows 下无法精确表示 16ms 以下的精度（可能时间片的大小是 16ms ），所以这里用比较大的数来测试。<br>代码如下<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;(even?&nbsp;x)&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(remainder&nbsp;x&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))<br><br>(define&nbsp;(runtime)&nbsp;(current-milliseconds))<br><br>(define&nbsp;(start-prime-test&nbsp;n&nbsp;start-time)<br>&nbsp;&nbsp;(and&nbsp;(prime?&nbsp;n)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(report-prime&nbsp;(-&nbsp;(runtime)&nbsp;start-time))))<br><br>(define&nbsp;(report-prime&nbsp;elapsed-time)<br>&nbsp;&nbsp;(display&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;***&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;(display&nbsp;elapsed-time))<br><br>(define&nbsp;(search-iter&nbsp;cur-num&nbsp;index&nbsp;start-time)<br>&nbsp;&nbsp;(newline)<br>&nbsp;&nbsp;(display&nbsp;cur-num)<br>&nbsp;&nbsp;(if&nbsp;(not&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;index&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(start-prime-test&nbsp;cur-num&nbsp;start-time)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(search-iter&nbsp;(+&nbsp;cur-num&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;(-&nbsp;index&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;start-time)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(search-iter&nbsp;(+&nbsp;cur-num&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;index&nbsp;start-time))))<br><br>(define&nbsp;(search-for-primes&nbsp;start-number)<br>&nbsp;&nbsp;(if&nbsp;(even?&nbsp;start-number)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(search-iter&nbsp;(+&nbsp;start-number&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;(runtime))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(search-iter&nbsp;start-number&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;(runtime))))<br></span></div>
<br>这里用到了 prime? 谓词，代码不再复述。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>|------+--------+--------+-------|<br>|10^9&nbsp; | 10^10&nbsp; | 10^11&nbsp; | 10^12 | =&gt; start-number<br>|------+--------+--------+-------|<br>|31&nbsp; &nbsp; | 250&nbsp;&nbsp;&nbsp; | 609&nbsp;&nbsp;&nbsp;  |  1953&nbsp; | (ms)<br>|47&nbsp;&nbsp;&nbsp; | 406&nbsp;&nbsp;&nbsp;  |  1203&nbsp;&nbsp; | 3844&nbsp; |<br>|78&nbsp;&nbsp;&nbsp; | 625&nbsp;&nbsp;&nbsp;  |  1859&nbsp;&nbsp; | 5719&nbsp; |<br>|------+--------+--------+-------|<br><br></span>从上表可以看出，除了前两列之间，后列的数字都是前列数字的 3 倍左右，近似于 &#8730;10 ≈ 3.16。实际上，随着 n 的不断增大，这个数会逐渐逼近 &#8730;10。<br><br><span style="font-weight: bold;">1.23<br><br></span>
<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;(next&nbsp;n)<br>&nbsp;&nbsp;(if&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;">)&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;(+&nbsp;n&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)))<br><br>(define&nbsp;(find-divisor&nbsp;n&nbsp;test-divisor)<br>&nbsp;&nbsp;(cond&nbsp;((&gt;&nbsp;(square&nbsp;test-divisor)&nbsp;n)&nbsp;n)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((divides?&nbsp;test-divisor&nbsp;n)&nbsp;test-divisor)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(find-divisor&nbsp;n&nbsp;(next&nbsp;test-divisor)))))</span></div>
<br>计算结果如下：<br>|--------+--------+-------|<br>| 10^10&nbsp; | 10^11&nbsp; | 10^12 | =&gt; start-number<br>|--------+--------+-------|<br>| 141&nbsp; &nbsp; | 297 &nbsp;&nbsp;  | 1078&nbsp; | (ms)<br>| 219 &nbsp;&nbsp;  | 609 &nbsp;&nbsp; | 2093&nbsp; |<br>| 313 &nbsp;&nbsp;  | 984&nbsp; &nbsp; | 3140&nbsp; |<br>|--------+--------+-------|
<br><br>可以看出这个比值大约在 1.8(1/0.55) 左右，可能原因是其它的计算需要时间，但当 n 不断增大，其它计算是常数阶，这个比值会不断接近2。<br><br><br></span><img src ="http://www.cppblog.com/cuigang/aggbug/45648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-28 23:44 <a href="http://www.cppblog.com/cuigang/archive/2008/03/28/45648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.20）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/27/45554.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Thu, 27 Mar 2008 13:59:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/27/45554.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/45554.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/27/45554.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/45554.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/45554.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: courier new;"><span style="font-weight: bold;">1.20</span><br>下面用 % 表示过程 remainder，那么正则序的过程如下：<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;(gcd&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)<br>&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;(gcd&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))<br>&nbsp;(gcd&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))<br>&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">&lt;##&nbsp;&nbsp;1&gt;&nbsp;[6]</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gcd&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))<br>&nbsp;(gcd&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))<br>&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">&lt;##&nbsp;&nbsp;2&gt;&nbsp;[4]</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gcd&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))))<br>&nbsp;(gcd&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))))<br>&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">&lt;##&nbsp;4&gt;[2]</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gcd&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))))))<br>&nbsp;(gcd&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))))))<br>&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">))&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))))&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">&lt;##&nbsp;7&gt;[0]</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gcd ...)<br>&nbsp;(%&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))&nbsp;&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">&lt;##&nbsp;4&gt;[2]</span><span style="color: #008000;"><br></span></div>
<br>可以看出需要调用 remainder 共 1+2+4+7+4 = 18 次。<br><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;">(gcd&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;(gcd&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">206</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">)))&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">&lt;##&gt;</span><span style="color: #008000;"><br></span><span style="color: #000000;">(gcd&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">)<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;(gcd&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">&lt;##&gt;</span><span style="color: #008000;"><br></span><span style="color: #000000;">(gcd&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">)<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(gcd&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">&lt;##&gt;</span><span style="color: #008000;"><br></span><span style="color: #000000;">(gcd&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;(gcd&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">;</span><span style="color: #008000;">&lt;##&gt;</span><span style="color: #008000;"><br></span><span style="color: #000000;">(gcd&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;(gcd&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;(%&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)))<br></span><span style="color: #000000;">2</span></div>
<br>可以看出共需 4 次。<br><br><br></span>  <img src ="http://www.cppblog.com/cuigang/aggbug/45554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-27 21:59 <a href="http://www.cppblog.com/cuigang/archive/2008/03/27/45554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.16~1.19）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/27/45482.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Wed, 26 Mar 2008 16:53:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/27/45482.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/45482.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/27/45482.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/45482.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/45482.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: courier new;"><span style="font-weight: bold;">1.16</span><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;(fast-expt&nbsp;x&nbsp;n)<br>&nbsp;&nbsp;(fast-expt-iter&nbsp;x&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br><br>(define&nbsp;(fast-expt-iter&nbsp;x&nbsp;n&nbsp;a)<br>&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;a)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((even?&nbsp;n)&nbsp;(fast-expt-iter&nbsp;(square&nbsp;x)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(/&nbsp;n&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(fast-expt-iter&nbsp;x&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*&nbsp;a&nbsp;x)))))</span></div>
<br style="font-weight: bold;"><span style="font-weight: bold;">1.17</span><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;(multi&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(+&nbsp;x&nbsp;(multi&nbsp;x&nbsp;(-&nbsp;y&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)))))<br><br>(define&nbsp;(fast-multi&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((even?&nbsp;y)&nbsp;(double&nbsp;(fast-multi&nbsp;x<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(half&nbsp;y))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(+&nbsp;x&nbsp;(fast-multi&nbsp;x&nbsp;(-&nbsp;y&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))))))<br><br>(define&nbsp;(double&nbsp;x)&nbsp;(+&nbsp;x&nbsp;x))<br>(define&nbsp;(half&nbsp;y)&nbsp;(/&nbsp;y&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">))</span></div>
<br><span style="font-weight: bold;">1.18</span><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;(double&nbsp;x)&nbsp;(+&nbsp;x&nbsp;x))<br>(define&nbsp;(half&nbsp;y)&nbsp;(/&nbsp;y&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">))<br><br>(define&nbsp;(fast-multi&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(fast-multi-iter&nbsp;x&nbsp;y&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))<br><br>(define&nbsp;(fast-multi-iter&nbsp;x&nbsp;y&nbsp;p)<br>&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((even?&nbsp;y)&nbsp;(fast-multi-iter&nbsp;(double&nbsp;x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(half&nbsp;y)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(fast-multi-iter&nbsp;x&nbsp;(-&nbsp;y&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;(+&nbsp;p&nbsp;x)))))</span></div>
<br><span style="font-weight: bold;">1.19</span><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: #008000;">;</span><span style="color: #008000;">T(pq):(a,b)=&gt;(bq+aq+ap,&nbsp;bp+aq)</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">T(pq):(bq+aq+ap,&nbsp;bp+aq)=&gt;((bp+aq)q&nbsp;+&nbsp;(bq+aq+ap)q&nbsp;+&nbsp;(bq+aq+ap)p,</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(bp+aq)p&nbsp;+&nbsp;(bq+aq+ap)q)</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;(2bpq+2aqq+bqq+2apq+app,&nbsp;bpp+2apq+bqq+aqq)</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;(b(2pq+qq)+a(2pq+qq)+a(qq+pp),&nbsp;b(qq+pp)+a(2pq+qq))</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">q'&nbsp;=&nbsp;2pq+qq</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">p'&nbsp;=&nbsp;qq+pp</span><span style="color: #008000;"><br>;<br></span><span style="color: #000000;"></span><span style="color: #000000;">(define&nbsp;(fib&nbsp;n)<br>&nbsp;&nbsp;(fib-iter&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;n))<br><br>(define&nbsp;(fib-iter&nbsp;a&nbsp;b&nbsp;p&nbsp;q&nbsp;count)<br>&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;count&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((even?&nbsp;count)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(fib-iter&nbsp;a<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(+&nbsp;(*&nbsp;p&nbsp;p)&nbsp;(*&nbsp;q&nbsp;q))<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: #000000;">2</span><span style="color: #000000;">&nbsp;p&nbsp;q&nbsp;)&nbsp;(*&nbsp;q&nbsp;q))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(/&nbsp;count&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(fib-iter&nbsp;(+&nbsp;(*&nbsp;b&nbsp;q)&nbsp;(*&nbsp;a&nbsp;q)&nbsp;(*&nbsp;a&nbsp;p))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(+&nbsp;(*&nbsp;b&nbsp;p)&nbsp;(*&nbsp;a&nbsp;q))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&nbsp;count&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)))))<br></span></div>
<br><br></span> <img src ="http://www.cppblog.com/cuigang/aggbug/45482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-27 00:53 <a href="http://www.cppblog.com/cuigang/archive/2008/03/27/45482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.14~1.15）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/26/45470.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Wed, 26 Mar 2008 14:56:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/26/45470.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/45470.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/26/45470.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/45470.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/45470.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-weight: bold;">1.14</span><br>计算过程的树如下：<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/cuigang/111.jpg" height="413" width="488"><br></span><br>很容易看出，计算过程的空间需求，也就是树的深度，取决于最左边的子树，即(n 1)，它的深度是n+6，O(n).<br><br>然后对于计算步数，也就是树的节点数，我们知道对于一个二叉树，树的节点数 = 左子树节点数 + 右子树节点数 + 1.<br>先来看 (n 1) 子树，设它的节点数是f(n), 而且总有，非叶节点左子树节点数为1<br>当 n=1，f(1) = 3<br>&nbsp;&nbsp; n&gt;1, f(n) = 1 + f(n-1) + 1 = f(n-1) + 2 = f(n-2) + 2*2 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = f(n-(n-1)) + 2*(n-1) = 2n + 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = O(n)<br><br>再来看 (n 2) 子树，设它的节点数 g(n), 设 ┌ n/5 ┐ = A <br>g(n) = f(n) + g(n-5) + 1 = f(n) + f(n-5) + g(n-5*2) + 2<br>&nbsp;&nbsp;&nbsp;&nbsp; = f(n) + ... + f(n-5*(A-1)) + g(n-5*A) + 2A<br>&nbsp;&nbsp;&nbsp;&nbsp; = O(n^2)<br><br>依此类推，可以得出结论 (n 5) 的计算步数增长的阶 为 O(n^5)<br><br><span style="font-weight: bold;">1.15</span><br>a) 12.15 连除 5次 3 小于 0.1 ，所以是 5次<br>b) 可以看出每调用一次 p 过程，需要递归1次 sine ，空间加1，计算步数加2，关键是p的次数：<br>&nbsp;&nbsp; 对于a，调用次数t，那么 a*3^(-t) &lt; 0.1 , 即 10a &lt; 3^t ==&gt; lg(10a)/lg3 &lt; t,<br>&nbsp;&nbsp; 所以增长阶 空间和时间 都为 O(log a)<br><br><br><br></span> <img src ="http://www.cppblog.com/cuigang/aggbug/45470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-26 22:56 <a href="http://www.cppblog.com/cuigang/archive/2008/03/26/45470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.11~1.13）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/12/44316.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Wed, 12 Mar 2008 15:10:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/12/44316.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/44316.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/12/44316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/44316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/44316.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;"><span style="font-weight: bold;">1.11</span><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;func-recu<br>&nbsp;&nbsp;(lambda(n)<br>&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((&lt;&nbsp;n&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;n)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(+&nbsp;(func-recu&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;(func-recu&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;(func-recu&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">))))))))</span></div>
迭代计算过程为<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;func-iter<br>&nbsp;&nbsp;(lambda(a&nbsp;b&nbsp;c&nbsp;n)<br>&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(func-iter&nbsp;b&nbsp;c&nbsp;(+&nbsp;(*&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;a)&nbsp;(*&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;b)&nbsp;c)&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)))))<br><br>(define&nbsp;(func&nbsp;n)&nbsp;(func-iter&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;n))</span></div>
<br><span style="font-weight: bold;">1.12<br></span>中文版原题翻译有误，应为计算pascal三角中的元素。<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: #008000;">;</span><span style="color: #008000;">pas(n,k)</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">if&nbsp;(k=1)&nbsp;or&nbsp;(k=n),&nbsp;then&nbsp;pas(n,k)&nbsp;=&nbsp;1</span><span style="color: #008000;"><br>;</span><span style="color: #008000;">else&nbsp;pas(n,k)&nbsp;=&nbsp;pas(n-1,k-1)&nbsp;+&nbsp;pas(n-1,k)</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>(define&nbsp;pas&nbsp;(lambda(n&nbsp;k)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(or&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;k&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;k&nbsp;n))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(+&nbsp;(pas&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;(-&nbsp;k&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pas&nbsp;(-&nbsp;n&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;k)))))<br></span></div>
<br><span style="font-weight: bold;">1.13</span><br>中文版原题翻译遗漏 提示 ：&#968;=(1-&#8730;5)/2<br>已知，&#966;^2 = &#966; + 1, 那么 &#966;^n = &#966;^(n-1) + &#966;^(n-2)</span><br>同理，</span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#968;^2 = </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#968; + 1, </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">那么 </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#968;^n = </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#968;^(n-1) + </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#968;^(n-2)<br>又 </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#966;-&#968; = </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">(1+&#8730;5)/2 -</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"> (1-&#8730;5)/2</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"> = </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span><span style="font-size: 10pt;"><br><span style="font-size: 10pt;"><br>when n=0, Fib(0) = 0 = </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">(&#966;^0-&#968;^0)/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"></span></span><br><span style="font-size: 10pt;"><span style="font-size: 10pt;">when n=1, Fib(1) = 1 = </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"></span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"> = (&#966;-&#968;)/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"><br>when n&gt;2, Fib(n) = Fib(n-1) + Fib(n-2) = (&#966;^(n-1)-&#968;^(n-1))/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"> + (&#966;^(n-2)-&#968;^(n-2))/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"></span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ((</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#966;^(n-1)+(&#966;^(n-2))) - (</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#968;^(n-1)</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">+&#968;^(n-2)))/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span><br><span style="font-size: 10pt;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = (</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#966;^n - </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"></span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#968;^n)/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5<br><br>又 -1&lt; </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#968;</span></span> &lt; 0, 故 -0.5&lt; -1/</span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span></span><span style="font-size: 10pt; font-family: courier new;">&lt; &#968;^n/</span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span></span><span style="font-size: 10pt; font-family: courier new;"> &lt; 1</span><span style="font-size: 10pt; font-family: courier new;">/</span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span></span><span style="font-size: 10pt; font-family: courier new;"></span><span style="font-size: 10pt; font-family: courier new;"> &lt;0.5
, 而 </span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;"></span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#966;^n</span></span></span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;">/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5</span></span></span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;"> = </span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;"></span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#968;^n/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5 + Fib(n)<br><br>可知 |</span></span></span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#966;^n</span></span></span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;">/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5 - Fib(n)| &lt; 0.5, Fib(n)是最接近</span></span></span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;"></span></span></span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#966;^n</span></span></span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;">/</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">&#8730;5的整数。</span></span></span><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;"></span></span></span><br><span style="font-size: 10pt; font-family: courier new;"><span style="font-size: 10pt;"><span style="font-size: 10pt;"><br><br></span></span></span> <img src ="http://www.cppblog.com/cuigang/aggbug/44316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-12 23:10 <a href="http://www.cppblog.com/cuigang/archive/2008/03/12/44316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.10）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/11/44218.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 11 Mar 2008 15:33:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/11/44218.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/44218.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/11/44218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/44218.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/44218.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: courier new;">首先，可以写出这个函数的函数式：<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;&nbsp; y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #008000;">;<br></span><span style="color: #000000;">f(x</span><span style="color: #000000;">,</span><span style="color: #000000;">y)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;2y</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #008000;">;<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #008000;">;<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f(x-</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;f(x</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;y-</span><span style="color: #000000;">1</span><span style="color: #000000;">))</span><span style="color: #008000;">;</span></div>
<br>那么，对于 f(0,n), n&gt;=0<br>当&nbsp;&nbsp; n &gt;= 1 时， f(0,n) = 2n ，<br>而当 n =&nbsp; 0 时， f(0,0) = 0 = 2*0， 也满足 2n ，<br>故 f(0,n) = 2n, n&gt;=0.<br><br>对于f(1,n), n&gt;=1<br>当 n &gt; 1 时，有 f(1,n) = f(0, f(1, n-1)) = 2*f(1,n-1),<br>设 f(1,n) = 2^n<br>if&nbsp;&nbsp; n = 1,&nbsp;&nbsp;&nbsp; f(1,1)&nbsp;&nbsp;&nbsp; = 2 = 2^1<br>when n &gt; 1, if f(1,n-1)&nbsp; = 2^(n-1)<br>then f(1,n) = 2*f(1,n-1) = 2*(2^(n-1)) = 2^n<br>故 f(1,n) = 2^n, n&gt;0.<br><br>对于f(2,n), n&gt;0<br>if n &gt; 1 ,then f(2,n) = f(1, f(2, n-1)) = 2^f(2,n-1),<br>设 f(2,n) = 2^(2^(... (n 个 2)<br>if&nbsp;&nbsp; n = 1, then f(2,1)&nbsp; = 2<br>when n &gt; 1, if f(2, n-1) = 2^(2^(...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (n-1)<br>then f(2,n) = 2^f(2,n-1) = 2^(2^(<br><br>这样我们对于 (A 1 10) = 2^10 = 1024, (A 2 4) = 2^(2^(2^2)) = 2^16 = 65536<br>而 (A 3 3) = (A 2 A(3 2)) = A(2 A(2 A(2 1))) = (A 2 4) = 2^16 = 65536<br><br>(f n) = (A 0 n) = 2n<br>(g n) = (A 1 n) = 2^n<br>(h n) = (A 2 n) = 2^(2^(...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (n个2)<br><br>---------------------------------------------<br>在网上可以找到关于 Ackermann 函数的讨论，主要是针对这个双递归如何用迭代来实现，Ackermann 函数是 <font size="-1">德国数学家W.Ackermann</font> 在1928年提出的。在 WikiPedia 英文版上可以搜索 Ackermann function
词条，有详细介绍，不过这个Ackermann function
略有不同。如下图：<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/cuigang/0ae4053de098cc9554752b190a38bc56.png" height="85" width="490"><br><br></span>   <img src ="http://www.cppblog.com/cuigang/aggbug/44218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-11 23:33 <a href="http://www.cppblog.com/cuigang/archive/2008/03/11/44218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.9）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/11/44213.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 11 Mar 2008 13:53:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/11/44213.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/44213.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/11/44213.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/44213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/44213.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: courier new;">很显然，第一个是递归的，第二个是迭代的。<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;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;(inc&nbsp;(+&nbsp;(dec&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)))<br>(inc&nbsp;(+&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">))<br>(inc&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;(inc&nbsp;(+&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">))))<br>(inc&nbsp;(inc&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;(inc&nbsp;(+&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)))))<br>(inc&nbsp;(inc&nbsp;(inc&nbsp;(if&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;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;(inc&nbsp;(+&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">))))))<br>(inc&nbsp;(inc&nbsp;(inc&nbsp;(inc&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;(inc&nbsp;(+&nbsp;(dec&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)))))))<br>(inc&nbsp;(inc&nbsp;(inc&nbsp;(inc&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">))))<br>(inc&nbsp;(inc&nbsp;(inc&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">)))<br>(inc&nbsp;(inc&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">))<br>(inc&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">)<br></span><span style="color: #000000;">9</span><span style="color: #000000;"><br><br>(+&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;(+&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">))<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;(+&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">))<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">&nbsp;(+&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">))<br>(if&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;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">&nbsp;(+&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">))<br>(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">&nbsp;(+&nbsp;(dec&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;(inc&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">)))<br></span><span style="color: #000000;">9</span></div>
<br><br></span> <img src ="http://www.cppblog.com/cuigang/aggbug/44213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-11 21:53 <a href="http://www.cppblog.com/cuigang/archive/2008/03/11/44213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.8）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/11/44211.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 11 Mar 2008 13:24:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/11/44211.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/44211.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/11/44211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/44211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/44211.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-family: courier new;">采用1.7中的变化率为终止检测。</span><br style="font-family: courier new;"><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(cube-root&nbsp;x)<br>&nbsp;&nbsp;(cube-root-iter&nbsp;x&nbsp;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">&nbsp;x))<br><br>(define&nbsp;(cube-root-iter&nbsp;last-guess&nbsp;guess&nbsp;x)<br>&nbsp;&nbsp;(if&nbsp;(enuf?&nbsp;last-guess&nbsp;guess)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;guess<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cube-root-iter&nbsp;guess&nbsp;(improve&nbsp;guess&nbsp;x)&nbsp;x)))<br><br>(define&nbsp;(enuf?&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(&lt;&nbsp;(/&nbsp;(abs&nbsp;(-&nbsp;x&nbsp;y))&nbsp;y)&nbsp;</span><span style="color: #000000;">0.001</span><span style="color: #000000;">))<br><br>(define&nbsp;improve&nbsp;(lambda&nbsp;(y&nbsp;x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(/&nbsp;(+&nbsp;(/&nbsp;x&nbsp;(*&nbsp;y&nbsp;y))&nbsp;(*&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;y))&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)))<br></span></div>
<br></span> <img src ="http://www.cppblog.com/cuigang/aggbug/44211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-11 21:24 <a href="http://www.cppblog.com/cuigang/archive/2008/03/11/44211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.7）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/11/44125.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 10 Mar 2008 16:07:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/11/44125.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/44125.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/11/44125.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/44125.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/44125.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-family: courier new;">对于正文中的 good-enough? 谓词，设所求 x 的真实平方根为 xt，那么我们的依据是当 guess 从 1 趋向与 xt 的平方差 小于 c(0.001) 时，guess 近似于 xt。实际当 xt^2 也就是 x 足够小时， guess 会 逐渐稳定在 &#8730;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: #000000;">&gt;&nbsp;(sqrt&nbsp;(square&nbsp;</span><span style="color: #000000;">0.1</span><span style="color: #000000;">))<br></span><span style="color: #000000;">0.10032578510960607</span><span style="color: #000000;"><br>&gt;&nbsp;(sqrt&nbsp;(square&nbsp;</span><span style="color: #000000;">0.05</span><span style="color: #000000;">))<br></span><span style="color: #000000;">0.054237622808967656</span><span style="color: #000000;"><br>&gt;&nbsp;(sqrt&nbsp;(square&nbsp;</span><span style="color: #000000;">0.01</span><span style="color: #000000;">))<br></span><span style="color: #000000;">0.03230844833048122</span><span style="color: #000000;"><br>&gt;&nbsp;(sqrt&nbsp;(square&nbsp;</span><span style="color: #000000;">0.005</span><span style="color: #000000;">))<br></span><span style="color: #000000;">0.031515954454847304</span><span style="color: #000000;"><br>&gt;&nbsp;(sqrt&nbsp;(square&nbsp;</span><span style="color: #000000;">0.001</span><span style="color: #000000;">))<br></span><span style="color: #000000;">0.031260655525445276</span><span style="color: #000000;"><br>&gt;&nbsp;(sqrt&nbsp;(square&nbsp;</span><span style="color: #000000;">0.0001</span><span style="color: #000000;">))<br></span><span style="color: #000000;">0.03125010656242753</span><span style="color: #000000;"><br>&gt; <br></span></div>
&nbsp;<br>因为 guess^2 &lt; c + x
, 当 x &lt; c 时，guess 就更多的依赖于 c 了。<br><br>对于特别大的数，由于浮点数在特别大时，离散性非常明显，相邻的两个数之间的差距会非常大，导致 |guess^2 - x| 始终 大于 c，计算便进入了 无限循环。<br><br>比如计算 (sqrt 1e300)<br><br>使用变化率改进后的代码如下：<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;(sqrt-new&nbsp;x)<br>&nbsp;&nbsp;(sqrt-iter-new&nbsp;x&nbsp;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">&nbsp;x))<br><br>(define&nbsp;(sqrt-iter-new&nbsp;s1&nbsp;s2&nbsp;x)<br>&nbsp;&nbsp;(if&nbsp;(enuf-new?&nbsp;s1&nbsp;s2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sqrt-iter-new&nbsp;s2&nbsp;(improve&nbsp;s2&nbsp;x)&nbsp;x)))<br><br>(define&nbsp;(enuf-new?&nbsp;s1&nbsp;s2)<br>&nbsp;&nbsp;(&lt;&nbsp;(/&nbsp;(abs&nbsp;(-&nbsp;s1&nbsp;s2))&nbsp;s1)&nbsp;</span><span style="color: #000000;">0.001</span><span style="color: #000000;">))</span></div>
<br>可以测算几个数，验证结果还是比较好的。<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;">&gt;&nbsp;(sqrt-new&nbsp;(square&nbsp;</span><span style="color: #000000;">1e150</span><span style="color: #000000;">))<br></span><span style="color: #000000;">1.0000000000084744e+150</span><span style="color: #000000;"><br>&gt;&nbsp;(sqrt-new&nbsp;(square&nbsp;</span><span style="color: #000000;">1e-150</span><span style="color: #000000;">))<br></span><span style="color: #000000;">1.0000000000084744e-150</span></div>
<br><br style="font-family: courier new;"></span></span>  <img src ="http://www.cppblog.com/cuigang/aggbug/44125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-11 00:07 <a href="http://www.cppblog.com/cuigang/archive/2008/03/11/44125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.6）</title><link>http://www.cppblog.com/cuigang/archive/2008/03/09/44047.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Sun, 09 Mar 2008 15:12:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/03/09/44047.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/44047.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/03/09/44047.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/44047.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/44047.html</trackback:ping><description><![CDATA[<span style="font-family: courier new; font-size: 10pt;"><span style="font-family: 微软雅黑;"></span>会递归直到堆栈溢出。<br>原因是 在 new-if 还没有展开为 cond special forms 时，else-clause 子式已经陷入了无限递归。 做了以下实验，可以验证<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;(new-if&nbsp;pred&nbsp;thenc&nbsp;elsec)<br>&nbsp;&nbsp;(cond&nbsp;(pred&nbsp;thenc)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;elsec)))<br><br>(define&nbsp;(iter&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(new-if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;(+&nbsp;x&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;y)))<br><br>(define&nbsp;(iter-if&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(if&nbsp;(</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter-if&nbsp;(+&nbsp;x&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;y)))<br><br>(define&nbsp;(iter-cond&nbsp;x&nbsp;y)<br>&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;x&nbsp;y)&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(else&nbsp;(iter-cond (+&nbsp;x&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;y))))</span></div>
<br>对于 (iter 1 10), (iter-if 1 10), (iter-cond 1 10)<br>其中 iter 会 导致堆栈溢出，而 iter-cond 和 iter-if 并不会。<br><br>此题同1.5<br>在1.5中，由于应用序的原因，在 test 表达式 还没有展开为 if 特殊形式（special forms）时， (p)已经陷入了无限递归。<br></span><br>  <img src ="http://www.cppblog.com/cuigang/aggbug/44047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-03-09 23:12 <a href="http://www.cppblog.com/cuigang/archive/2008/03/09/44047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的SICP习题答案（1.1~1.5）</title><link>http://www.cppblog.com/cuigang/archive/2007/12/26/39635.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 25 Dec 2007 16:19:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2007/12/26/39635.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/39635.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2007/12/26/39635.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/39635.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/39635.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">1.1 <br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: courier new; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">10</span><span style="color: #000000">,</span><span style="color: #000000">12</span><span style="color: #000000">,</span><span style="color: #000000">8</span><span style="color: #000000">,</span><span style="color: #000000">3</span><span style="color: #000000">,</span><span style="color: #b6b6b6">10</span><span style="color: #000000"> <span style="color: #ff0000">6</span>,</span><span style="color: #000000">a</span><span style="color: #000000">,</span><span style="color: #000000">b</span><span style="color: #000000">,</span><span style="color: #000000">19</span><span style="color: #000000">,</span><span style="color: #000000">#f</span><span style="color: #000000">,</span><span style="color: #000000">4</span><span style="color: #000000">,</span><span style="color: #000000">16</span><span style="color: #000000">,</span><span style="color: #000000">6</span><span style="color: #000000">,</span><span style="color: #000000">16</span></div><span style="font-family: courier new"><br />1.2</span><br /><br style="font-family: courier new" /><span style="font-family: courier new">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">(/(+&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;(-&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;(-&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">&nbsp;(+&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">(/&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">)))))(*&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">&nbsp;(-&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)(-&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">)))</span></div><br />or<br /><br style="font-family: courier new" /></span><span style="font-family: courier new">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">(/(+&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;(-&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;(-&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">&nbsp;(+&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">/</span><span style="color: #000000">5</span><span style="color: #000000">))))(*&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">&nbsp;(-&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)(-&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">)))</span></div></span><br style="font-family: courier new" /><span style="font-family: courier new">1.3<br /><br />这个问题中文版的翻译是错的，参看原文是求平方和而不是&#8220;和&#8221;。<br /><br /></span>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: courier new; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">(define&nbsp;(square(x)(*&nbsp;x&nbsp;x)))<br />(define&nbsp;(max&nbsp;x&nbsp;y)(if&nbsp;(&lt;&nbsp;x&nbsp;y)&nbsp;y&nbsp;x))<br />(define&nbsp;(func&nbsp;x&nbsp;y&nbsp;z)<br />&nbsp;&nbsp;(+&nbsp;(square&nbsp;(max&nbsp;x&nbsp;y))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(square&nbsp;(max&nbsp;(min&nbsp;x&nbsp;y)&nbsp;z))))</span></div><br style="font-family: courier new" /><span style="font-family: courier new">1.4<br /><br style="font-family: courier new" /></span><span style="font-family: courier new">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">a+|b|&nbsp;</span></div></span><br style="font-family: courier new" /><span style="font-family: courier new">&lt;=&gt;<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span>&nbsp;<span style="color: #008000">#</span><span style="color: #008000">&nbsp;in&nbsp;python</span><span style="color: #008000"><br /></span><span style="color: #008080">2</span>&nbsp;<span style="color: #008000"></span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;a_plus_abs_b(a,b):<br /></span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;b</span><span style="color: #000000">&gt;</span><span style="color: #000000">0&nbsp;:<br /></span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;b<br /></span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">:<br /></span><span style="color: #008080">6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;b<br /></span><span style="color: #008080">7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;x</span></div><br style="font-family: courier new" /></span><span style="font-family: courier new"></span><span style="font-family: courier new"></span><span style="font-family: courier new">1.5<br /><br style="font-family: courier new" /></span><span style="font-family: courier new"></span><strike><span style="color: #adb8c6">在网上看了很多答案，都认为&#8220;应用序&#8221;的实现会导致死循环，我非常困惑。反复看了中文版和英文版，觉得大家这样认为可能是书中说lisp的实现是&#8220;应用序&#8221;，而在scheme中跑这段代码会死循环，就先入为主的认为&#8220;应用序&#8221;的实现会死循环。其实对照正文，我们可以看到&#8220;正则序&#8221;停止展开的条件是&#8220;只包含基本运算符的表达式&#8221;，而对于</span><br style="color: #adb8c6" /><br style="color: #adb8c6" /></strike>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: courier new; color: #adb8c6; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><strike>(define&nbsp;(p)&nbsp;(p))</strike></div><br style="color: #adb8c6" /><strike><span style="color: #adb8c6">是无论如何也没法完全展开的，因为它会不断递归，所以&#8220;正则序&#8221;才会死循环。</span><br style="color: #adb8c6" /><br style="color: #adb8c6" /><span style="color: #adb8c6">而对于&#8220;应用序&#8221;的实现，则会这样展开</span></strike><br style="color: #adb8c6" /><br style="color: #adb8c6" />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: courier new; color: #adb8c6; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><strike>(test&nbsp;0&nbsp;(p))<br />(if&nbsp;(=&nbsp;0&nbsp;0)&nbsp;0&nbsp;(p))<br />(if&nbsp;#t&nbsp;0&nbsp;(p))<br /><br />; 0</strike></div><br style="font-family: courier new" /><span style="font-family: courier new">解决这个问题主要是&#8220;正则序&#8221;（Normal order）以及&#8220;应用序&#8221;（Applicative order）展开一个组合式的规则，仔细研究了MIT 6.001课程讲义，网上的各种答案，以及中英文版。我认为，正则序以类似广度优先的方式进行展开。而应用序优先计算子表达式，类似与深度优先。那么对于这个问题，</span></span><span style="font-family: courier new; font-size: 10pt">正则序</span><span style="font-size: 10pt"><span style="font-family: courier new">会展开为</span><br style="font-family: courier new" />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: courier new; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">=</span><span style="color: #000000">&gt;&nbsp;(if&nbsp;(</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;(p))<br /></span><span style="color: #000000">=</span><span style="color: #000000">&gt;&nbsp;(if&nbsp;#t&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;(p))<br /></span></div><span style="font-family: courier new">接着，由于这是一个if的special form（特殊形式），就会被展开为</span><br style="font-family: courier new" /><span style="font-family: courier new">0</span><br style="font-family: courier new" /><span style="font-family: courier new">而应用序，由于(p)一直可以递归代换，从一开始就会进入一个无限递归中去。</span><br />简言之，由于应用序的原因，在 test 表达式 还没有展开为 if 特殊形式（special forms）时， (p)已经陷入了无限递归。 <br /><br /></span><img src ="http://www.cppblog.com/cuigang/aggbug/39635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2007-12-26 00:19 <a href="http://www.cppblog.com/cuigang/archive/2007/12/26/39635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>