<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Recursion_and_iteration</id>
	<title>Recursion and iteration - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Recursion_and_iteration"/>
	<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Recursion_and_iteration&amp;action=history"/>
	<updated>2026-06-02T21:54:36Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.riguz.com/index.php?title=Recursion_and_iteration&amp;diff=3827&amp;oldid=prev</id>
		<title>Riguz：​Riguz移动页面Blog:递归和迭代至Recursion and iteration，不留重定向</title>
		<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Recursion_and_iteration&amp;diff=3827&amp;oldid=prev"/>
		<updated>2023-12-19T09:06:02Z</updated>

		<summary type="html">&lt;p&gt;Riguz移动页面&lt;a href=&quot;/index.php?title=Blog:%E9%80%92%E5%BD%92%E5%92%8C%E8%BF%AD%E4%BB%A3&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Blog:递归和迭代（页面不存在）&quot;&gt;Blog:递归和迭代&lt;/a&gt;至&lt;a href=&quot;/Recursion_and_iteration&quot; title=&quot;Recursion and iteration&quot;&gt;Recursion and iteration&lt;/a&gt;，不留重定向&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2023年12月19日 (二) 09:06的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;zh-Hans-CN&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;（没有差异）&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiki_db:diff:1.41:old-2502:rev-3827 --&gt;
&lt;/table&gt;</summary>
		<author><name>Riguz</name></author>
	</entry>
	<entry>
		<id>https://wiki.riguz.com/index.php?title=Recursion_and_iteration&amp;diff=2502&amp;oldid=prev</id>
		<title>imported&gt;Riguz：​这是读《计算机程序的构造和解释》的笔记。</title>
		<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Recursion_and_iteration&amp;diff=2502&amp;oldid=prev"/>
		<updated>2021-02-26T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;这是读《计算机程序的构造和解释》的笔记。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;这是读《计算机程序的构造和解释》的笔记。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 递归和迭代=&lt;br /&gt;
== 计算裴波拉切数列==&lt;br /&gt;
裴波拉切数列是很简单的过程，其数学公式如下：&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
Fib(n)=\left\{&lt;br /&gt;
\begin{array}{rcl}&lt;br /&gt;
0 &amp;amp; {n = 0}\\&lt;br /&gt;
1 &amp;amp; {n = 1}\\&lt;br /&gt;
Fib(n-1) + Fib(n-2) &amp;amp; {n &amp;gt; 1}\\&lt;br /&gt;
\end{array} \right.&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
使用递归非常容易解决，就是直接将这个公式翻译成计算机语言即可：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scheme&amp;quot;&amp;gt;&lt;br /&gt;
(define (fib n)&lt;br /&gt;
    (cond &lt;br /&gt;
        ((= n 0) 0)&lt;br /&gt;
        ((= n 1) 1)&lt;br /&gt;
        (else (+ (fib (- n 1))&lt;br /&gt;
                 (fib (- n 2)))&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
这个递归算法虽然实现很简单，但却有比较大的性能问题，出现了不必要的计算。例如计算Fib(5)，其计算过程如下：&lt;br /&gt;
&lt;br /&gt;
[[File:Fib-tree.png|600px|Fib(5)]]&lt;br /&gt;
&lt;br /&gt;
其中Fib(2)就计算了三次。那么，如何使用迭代来计算呢？迭代的思想在于给定若干变量的初始值，不断根据规则进行计算来改变这些变量，最后进行N次之后得到最终的结果。&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
a = Fib(1) \\&lt;br /&gt;
b = Fib(0)&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{进行迭代}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
a = a + b \\&lt;br /&gt;
b = a&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{通过n次迭代变成}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
a = Fib(n+1)) \\&lt;br /&gt;
b = Fib(n)&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
这样实际上需要三个变量：&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
F_{n} \\&lt;br /&gt;
F_{n+1} \\&lt;br /&gt;
Count&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{初始值}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
F_{n} &amp;amp;= Fib(0)\\&lt;br /&gt;
F_{n+1} &amp;amp;= Fib(1) \\&lt;br /&gt;
Count &amp;amp;= n&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{第一次迭代}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
F_{n} &amp;amp;= Fib(1)\\&lt;br /&gt;
F_{n+1} &amp;amp;= Fib(0) + Fib(1) \\&lt;br /&gt;
Count &amp;amp;= n - 1&lt;br /&gt;
\end{cases}\\&lt;br /&gt;
\xrightarrow[\text{第n次迭代}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
F_{n} &amp;amp;= Fib(n)\\&lt;br /&gt;
F_{n+1} &amp;amp;= Fib(n-1) + Fib(n) \\&lt;br /&gt;
Count &amp;amp;= 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
那么，翻译成代码就是：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scheme&amp;quot;&amp;gt;&lt;br /&gt;
(define (fib n)&lt;br /&gt;
     (fib_iter 1 0 n)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
(define (fib_iter a b i)&lt;br /&gt;
    (if (= i 0)&lt;br /&gt;
        b&lt;br /&gt;
        (fib_iter (+ a b) a (- i 1))&lt;br /&gt;
    )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Riguz</name></author>
	</entry>
</feed>