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

<channel>
	<title>帮助信息-动天数据 &#187; PHP速归函数</title>
	<atom:link href="http://www.583idc.com/news/?feed=rss2&#038;tag=php%E9%80%9F%E5%BD%92%E5%87%BD%E6%95%B0" rel="self" type="application/rss+xml" />
	<link>http://www.583idc.com/news</link>
	<description>提供虚拟主机帮助信息</description>
	<lastBuildDate>Mon, 30 Oct 2023 02:58:59 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>php递归函数  php递归算法经典实例大全</title>
		<link>http://www.583idc.com/news/?p=1817</link>
		<comments>http://www.583idc.com/news/?p=1817#comments</comments>
		<pubDate>Sat, 16 Dec 2017 13:28:58 +0000</pubDate>
		<dc:creator><![CDATA[dthost]]></dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[PHP速归函数]]></category>

		<guid isPermaLink="false">http://www.583idc.com/news/?p=1817</guid>
		<description><![CDATA[递归函数是数论函数的一种，其定义域与值域都是自然数集，只是由于构作函数方法的不同而有别于其他的函数。最简单又最 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>递归函数是数论函数的一种，其定义域与值域都是自然数集，只是由于构作函数方法的不同而有别于其他的函数。最简单又最基本的函数有三个：零函数O(x)=0(其值恒为0)，射影函数，后继函数S(x)=x+1，它们合称初始函数。要想由旧函数作出新函数，必须使用各种算子。在数理逻辑和计算机科学中，递归函数或μ-递归函数是一类从自然数到自然数的函数，它是在某种直觉意义上是"可计算的"。事实上，在可计算性理论中证明了递归函数精确的是图灵机的可计算函数。</p>
<p>&nbsp;</p>
<p><img title="递归函数" src="http://a4.att.hudong.com/18/72/20300542392970144765726846436_s.jpg" alt="递归函数" /></p>
<p>数论函数的一种,其定义域与值域都是自然数集,只是由于构作函数方法的不同而有别于其他的函数。处处有定义的函数叫做全函数，未必处处有定义的函数叫做部分函数。最简单又最基本的函数有三个:零函数<i>O</i>(<i>x</i>)=0(其值恒为0);射影函数<img id="changeTheId-img-71" title="递归函数" src="http://a3.att.hudong.com/45/15/01000000000000119081527928245_s.gif" alt="递归函数" align="absMiddle" data-original="http://a3.att.hudong.com/45/15/01000000000000119081527928245_s.gif" />；后继函数<i>S</i>(<i>x</i>)=<i>x</i>+1。它们合称初始函数。要想由旧函数作出新函数，必须使用各种算子。 <br data-filtered="filtered" />代入（又名复合或叠置）是最简单又最重要的造新函数的算子，其一般形状是：由一个m元函数<i>ƒ</i>与m个<i>n</i>元函数 <i>g</i><sub>1</sub>,<i>g</i><sub>2</sub>,…,<i>g</i><sub>m</sub> 造成新函数 <i>ƒ</i> (<i>g</i><sub>1</sub>(<i>x</i><sub>1</sub>,<i>x</i><sub>2</sub>,…,<i>x</i><sub><i>n</i></sub>)，<i>g</i><sub>2</sub>(<i>x</i><sub>1</sub>,<i>x</i><sub>2</sub>,…,<i>x</i><sub><i>n</i></sub>),…,<i>g</i><sub>m</sub>(<i>x</i><sub>1</sub>,<i>x</i><sub>2</sub>，…，<i>x</i><sub><i>n</i></sub>)),亦可记为<i>ƒ</i>(<i>g</i><sub>1</sub>，<i>g</i><sub>2</sub>,…,<i>g</i><sub>m</sub>)(<i>x</i><sub>1</sub>，<i>x</i><sub>2</sub>,…,<i>x</i><sub><i>n</i></sub>)。另一个造新函数的算子是原始递归式。具有<i>n</i>个参数<i>u</i><sub>1</sub>，<i>u</i><sub>2</sub>,…,<i>u</i><sub><i>n</i></sub>的原始递归式为：</p>
<p align="center"><img id="changeTheId-img-72" title="递归函数" src="http://a4.att.hudong.com/35/15/01000000000000119081527931535_s.gif" alt="递归函数" align="absMiddle" data-original="http://a4.att.hudong.com/35/15/01000000000000119081527931535_s.gif" /></p>
<p>具有一个参数的原始递归式可简写为：</p>
<p align="center"><img id="changeTheId-img-73" title="递归函数" src="http://a1.att.hudong.com/98/15/01000000000000119081527933298_s.gif" alt="递归函数" align="absMiddle" data-original="http://a1.att.hudong.com/98/15/01000000000000119081527933298_s.gif" /></p>
<p>其特点是，不能由<i>g</i>、<i>h</i>两函数直接计算新函数的一般值<i>ƒ</i>(<i>u</i>,<i>x</i>),而只能依次计算<i>ƒ</i>(<i>u</i>,0)，<i>ƒ</i>(<i>u</i>,1)，<i>ƒ</i>(<i>u</i>,2)，…；但只要依次计算，必能把任何一个<i>ƒ</i>(<i>u</i>,<i>x</i>)值都算出来。换句话说只要<i>g</i>,<i>h</i>为全函数且可计算，则新函数f也是全函数且可计算。 <br data-filtered="filtered" />由初始函数出发，经过有限次的代入与原始递归式而作出的函数叫做原始递归函数。由于初始函数显然是全函数且可计算，故原始递归函数都是全函数且可计算。通常使用的数论函数全是原始递归函数，可见原始递归函数是包括很广的。但是W.阿克曼证明了，可以作出一个可计算的全函数，它不是原始递归的。经过后人改进后，这个函数可写为如下定义的阿克曼函数：</p>
<p align="center"><img id="changeTheId-img-74" title="递归函数" src="http://a2.att.hudong.com/37/15/01000000000000119081527937237_s.gif" alt="递归函数" align="absMiddle" data-original="http://a2.att.hudong.com/37/15/01000000000000119081527937237_s.gif" /></p>
<p>容易看出,这个函数是处处可计算的。任给m,<i>n</i>的值，如果m为0，可由第一式算出；如果m不为0而<i>n</i>为0，可由第二式化归为求<i>g</i>(m,1)的值，这时第一变目减少了；如果m，<i>n</i>均不为0,根据第三式可先计算<i>g</i>(m,<i>n</i>-1),设为<i>α</i>，再计算<i>g</i>(m-1,<i>α</i>),前者第二变目减少（第一变目不变）,后者第一变目减少。极易用归纳法证得，这样一步一步地化归,最后必然化归到第一变目为0，从而可用第一式计算。所以这个函数是处处可计算的。此外又容易证明，对任何一个一元原始递归函数<i>ƒ</i>(<i>x</i>),永远可找出一数<i>α</i>使得<i>ƒ</i>(<i>x</i>)&lt;<i>g</i>(<i>α</i>,<i>x</i>)。这样，<i>g</i>(<i>x</i>,<i>x</i>)+1便不是原始递归函数，否则将可找出一数<i>b</i>使得<i>g</i>(<i>x</i>,<i>x</i>)+1&lt;<i>g</i>(<i>b</i>,<i>x</i>)。令<i>x</i>=<i>b</i>，即得<i>g</i>(<i>b</i>,<i>b</i>)+1&lt;<i>g</i>(<i>b</i>,<i>b</i>)，而这是不可能的。 <br data-filtered="filtered" />另一个重要的造新函数的算子是造逆函数的算子，例如，由加法而造减法，由乘法造除法等。一般，设已有函数<i>ƒ</i>(<i>u</i>,<i>x</i>),就<i>x</i>解方程<i>ƒ</i>(<i>u</i>,<i>x</i>)=<i>t</i>,可得<i>x</i>=<i>g</i>(<i>u</i>,<i>t</i>)。这时函数<i>g</i>叫做<i>ƒ</i>的逆函数。至于解一般方程<i>ƒ</i>(<i>u</i>，<i>t</i>,<i>x</i>)=0而得<i>x</i>＝<i>g</i>(<i>u</i>，<i>t</i>)可以看作求逆函数的推广。解方程可以看作使用求根算子。<i>ƒ</i>(<i>u</i>,<i>t</i>，<i>x</i>)=0的最小<i>x</i>根（如果有根的话），记为<i>μx</i>【<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)=0】。当方程没有根时,则认为<i>μx</i>【<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)=0】没有定义。可见,即使<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)处处有定义且可计算,但使用求根算子后所得的函数<i>μx</i>【<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)=0】仍不是全函数,可为部分函数。但只要它有定义，那就必然可以计算。这算子称为μ算子。如果<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)本身便是部分函数，则 <i>μx</i>【<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)=0】的意义是：当<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>n</i>)可计算且其值为0,而<i>x</i>&lt;<i>n</i>时<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)均可计算而其值非0，则 <i>μx</i>【<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)=0】指<i>n</i>；其他情况则作为无定义。例如，如果<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)=0根本没有根，或者虽然知道有一根为<i>n</i>，但<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>n</i>-1)不可计算,那么 <i>μx</i>【<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)=0】都作为没有定义。在这样定义后,只要 <i>μx</i>【<i>ƒ</i>(<i>u</i>,<i>t</i>,<i>x</i>)=0】有值便必可计算。由初始函数出发,经过有穷次使用代入、原始递归式与 <i>μ</i>算子而作成的函数叫做部分递归函数，处处有定义的部分递归函数称为全递归函数，或一般递归函数。 <br data-filtered="filtered" />原始递归函数类里还有一个重要的子类称为初等函数类,它是由非负整数与变元经过有穷次加、算术减（即｜<i>α</i>-<i>b</i>｜）、乘、算术除<img id="changeTheId-img-75" title="递归函数" src="http://a1.att.hudong.com/35/15/01000000000000119081527941435_s.gif" alt="递归函数" align="absMiddle" data-original="http://a1.att.hudong.com/35/15/01000000000000119081527941435_s.gif" />、叠加Σ、叠乘П而得的函数组成的类。 <br data-filtered="filtered" />波兰人A.格热高契克把原始递归函数类按定义的复杂程度来分类，称为格热高契克分层或波兰分层。 <br data-filtered="filtered" />要把递归函数应用于谓词，首先要定义谓词的特征函数。谓词<i>R</i>(<i>x</i>,<i>y</i>)的特征函数是</p>
<p align="center"><img id="changeTheId-img-76" title="递归函数" src="http://a2.att.hudong.com/75/15/01000000000000119081527942675_s.gif" alt="递归函数" align="absMiddle" data-original="http://a2.att.hudong.com/75/15/01000000000000119081527942675_s.gif" /></p>
<p>称谓词<i>R</i> 是递归谓词，若<i>R</i> 的特征函数是递归函数；称自然数子集<i>A</i>为递归集,若谓词<i>x</i>∈<i>A</i>是递归谓词。有了上述定义，就可以用递归函数来处理递归谓词和递归集。为了处理<i>N</i>×<i>N</i>（其中<i>N</i> 为自然数集）的子集，就要建立配对函数,所谓配对函数通常是指由<i>N</i>×<i>N</i> 到<i>N</i> 的一个函数<i>ƒ</i>(<i>x</i>，<i>y</i>)与它的逆函数<i>g</i><sub>1</sub>(<i>z</i>)，<i>g</i><sub>2</sub>(<i>z</i>)。它们都满足以下关系。</p>
<p>一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。这对于程序员来说，通常有很高的实用价值，常用来将复杂的问题分解为简单的并相同的情况，反复做这种处理直到问题解决。</p>
<p>用递归函数与不用递归函数的区别</p>
<p>示例一：使用静态变量</p>
<div class="jb51code">
<div>
<div id="highlighter_730985" class="syntaxhighlighter  php">
<div class="toolbar"><a class="toolbar_item command_help help" href="http://www.jb51.net/article/46784.htm#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php keyword">function</code> <code class="php plain">test(){</code></div>
<div class="line number2 index1 alt1"><code class="php spaces">  </code><code class="php keyword">static</code> <code class="php variable">$dig</code><code class="php plain">=0;</code></div>
<div class="line number3 index2 alt2"><code class="php spaces">  </code><code class="php keyword">if</code><code class="php plain">(</code><code class="php variable">$dig</code><code class="php plain">++&lt;10){</code></div>
<div class="line number4 index3 alt1"><code class="php spaces">    </code><code class="php functions">echo</code> <code class="php variable">$dig</code><code class="php plain">;</code></div>
<div class="line number5 index4 alt2"><code class="php spaces">    </code><code class="php plain">test();</code></div>
<div class="line number6 index5 alt1"><code class="php spaces">  </code><code class="php plain">}</code></div>
<div class="line number7 index6 alt2"><code class="php plain">}</code></div>
<div class="line number8 index7 alt1"><code class="php plain">test();</code><code class="php comments">//12345678910</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>示例二：使用递归函数和循环实现字符串逆转排列</p>
<div class="jb51code">
<div>
<div id="highlighter_16640" class="syntaxhighlighter  php">
<div class="toolbar"><a class="toolbar_item command_help help" href="http://www.jb51.net/article/46784.htm#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php keyword">function</code> <code class="php plain">unreverse(</code><code class="php variable">$str</code><code class="php plain">){</code></div>
<div class="line number2 index1 alt1"><code class="php spaces">  </code><code class="php keyword">for</code><code class="php plain">(</code><code class="php variable">$i</code><code class="php plain">=1;</code><code class="php variable">$i</code><code class="php plain">&lt;=</code><code class="php functions">strlen</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">);</code><code class="php variable">$i</code><code class="php plain">++){</code></div>
<div class="line number3 index2 alt2"><code class="php spaces">    </code><code class="php functions">echo</code> <code class="php functions">substr</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">,-</code><code class="php variable">$i</code><code class="php plain">,1);</code></div>
<div class="line number4 index3 alt1"><code class="php spaces">  </code><code class="php plain">}</code></div>
<div class="line number5 index4 alt2"><code class="php plain">}</code></div>
<div class="line number6 index5 alt1"><code class="php plain">unreverse(</code><code class="php string">"abcdefg"</code><code class="php plain">);</code><code class="php comments">//gfedcbc</code></div>
<div class="line number7 index6 alt2"></div>
<div class="line number8 index7 alt1"><code class="php keyword">function</code> <code class="php plain">reverse(</code><code class="php variable">$str</code><code class="php plain">){</code></div>
<div class="line number9 index8 alt2"><code class="php spaces">  </code><code class="php keyword">if</code><code class="php plain">(</code><code class="php functions">strlen</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">)&gt;0){</code></div>
<div class="line number10 index9 alt1"><code class="php spaces">    </code><code class="php plain">reverse(</code><code class="php functions">substr</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">,1));</code></div>
<div class="line number11 index10 alt2"><code class="php spaces">    </code><code class="php functions">echo</code> <code class="php functions">substr</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">,0,1);</code></div>
<div class="line number12 index11 alt1"><code class="php spaces">    </code><code class="php keyword">return</code><code class="php plain">;</code></div>
<div class="line number13 index12 alt2"><code class="php spaces">  </code><code class="php plain">}</code></div>
<div class="line number14 index13 alt1"><code class="php plain">}</code></div>
<div class="line number15 index14 alt2"><code class="php plain">reverse(</code><code class="php string">"abcdefg"</code><code class="php plain">);</code><code class="php comments">//gfedcbc</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>递归函数很多时候我们可以循环替代，建议当我们不能用循环替代时再用，因为用循环我们更容易理解，更不容易出错。</p>
<p>php递归函数 php支付递归函数，递归函数就是调用自己本身，这些函数特别适用于浏览动态数据结构，例如树和列表。<br data-filtered="filtered" />几乎没有web应用程序要求使用复杂的数据结构</p>
<div class="jb51code">
<div>
<div id="highlighter_40131" class="syntaxhighlighter  php">
<div class="toolbar"><a class="toolbar_item command_help help" href="http://www.jb51.net/article/46784.htm#">?</a></div>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></div>
<div class="line number2 index1 alt1"><code class="php keyword">function</code> <code class="php plain">reversr_r(</code><code class="php variable">$str</code><code class="php plain">)</code></div>
<div class="line number3 index2 alt2"><code class="php plain">{</code></div>
<div class="line number4 index3 alt1"><code class="php keyword">if</code> <code class="php plain">(</code><code class="php functions">strlen</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">)&gt;0)</code></div>
<div class="line number5 index4 alt2"><code class="php plain">reverse_r(</code><code class="php functions">substr</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">,1));</code></div>
<div class="line number6 index5 alt1"><code class="php functions">echo</code> <code class="php functions">substr</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">,0,1);</code></div>
<div class="line number7 index6 alt2"><code class="php keyword">return</code><code class="php plain">;</code></div>
<div class="line number8 index7 alt1"><code class="php plain">}</code></div>
<div class="line number9 index8 alt2"><code class="php plain">?&gt;</code></div>
<div class="line number10 index9 alt1"></div>
<div class="line number11 index10 alt2"><code class="php plain">&lt;?php</code></div>
<div class="line number12 index11 alt1"><code class="php keyword">function</code> <code class="php plain">reverse_i(</code><code class="php variable">$str</code><code class="php plain">)</code></div>
<div class="line number13 index12 alt2"><code class="php plain">{</code></div>
<div class="line number14 index13 alt1"><code class="php keyword">for</code><code class="php plain">(</code><code class="php variable">$i</code><code class="php plain">=1;</code><code class="php variable">$i</code><code class="php plain">&lt;=</code><code class="php functions">strlen</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">);</code><code class="php variable">$i</code><code class="php plain">++)</code></div>
<div class="line number15 index14 alt2"><code class="php plain">{</code></div>
<div class="line number16 index15 alt1"><code class="php functions">echo</code> <code class="php functions">substr</code><code class="php plain">(</code><code class="php variable">$str</code><code class="php plain">,-</code><code class="php variable">$i</code><code class="php plain">,1);</code></div>
<div class="line number17 index16 alt2"><code class="php plain">}</code></div>
<div class="line number18 index17 alt1"><code class="php plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>这个程序清单中实现两个函数，这两个函数都可以相反的顺序打印字符串的内容</p>
<p><br data-filtered="filtered" />函数reversr_r是通过递归实现的，而函数reverse_i()是通过循环实现的</p>
<p>&nbsp;</p>
<p><strong>递归函数</strong>即自调用函数，在函数体内部直接或者间接的自己调用自己，即函数的嵌套调用是函数本身。通常在此类型的函数提之中会附加一个条件判断叙述，以判断是否需要执行递归调用，并且在特定的条件下终止函数的递归调用动作，把目前流程的主控权交回到上一层函数来执行。以此，当某个执行递归调用的函数没有附加条件判断叙述时，可能会造成无限循环的错误情形。</p>
<p>函数递归调用最大的好处在于可以精简程序中的复杂重复调用程序，并且能以这种特性来执行一些较为复杂的运算动作。例如，列表、动态树形菜单及遍历目录等操作。相应的非递归函数虽然效率高，但却比较难编程，而且相对来说可读性差。现代程序设计的目标主要是可读性好。随着计算机硬件性能的不断提高，程序在更多的场合优先考虑可读而不是高效，所以，鼓励用递归函数实现程序思想。</p>
<p><strong>一个简单的递归调用实例如下所示：</strong></p>
<table class="syntaxhighlighter  php" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></div>
<div class="line number2 index1 alt1"><code class="php spaces"> </code><code class="php comments">//声明一个函数，用于测试递归</code></div>
<div class="line number3 index2 alt2"><code class="php spaces"> </code><code class="php keyword">function</code> <code class="php plain">test(</code><code class="php variable">$n</code><code class="php plain">){</code></div>
<div class="line number4 index3 alt1"><code class="php spaces">   </code><code class="php functions">echo</code> <code class="php variable">$n</code><code class="php plain">.</code><code class="php string">"&amp;nbsp;"</code><code class="php plain">;        </code><code class="php comments">//在函数开始输出参数的值</code></div>
<div class="line number5 index4 alt2"><code class="php spaces">   </code><code class="php keyword">if</code><code class="php plain">(</code><code class="php variable">$n</code><code class="php plain">&gt;0){                </code><code class="php comments">//判断参数是否大于0</code></div>
<div class="line number6 index5 alt1"><code class="php spaces">     </code><code class="php plain">test(</code><code class="php variable">$n</code><code class="php plain">-1);            </code><code class="php comments">//如果参数大于0则调用自己，并将参数减1后再次传入</code></div>
<div class="line number7 index6 alt2"><code class="php spaces">   </code><code class="php plain">}</code><code class="php keyword">else</code><code class="php plain">{                   </code><code class="php comments">//判断参数是不大于0</code></div>
<div class="line number8 index7 alt1"><code class="php spaces">     </code><code class="php functions">echo</code> <code class="php string">"&lt;--------&gt;  "</code><code class="php plain">;</code></div>
<div class="line number9 index8 alt2"><code class="php spaces">   </code><code class="php plain">}</code></div>
<div class="line number10 index9 alt1"><code class="php spaces">   </code><code class="php functions">echo</code> <code class="php variable">$n</code><code class="php plain">.</code><code class="php string">"&amp;nbsp;"</code><code class="php plain">;</code></div>
<div class="line number11 index10 alt2"><code class="php spaces"> </code><code class="php plain">}</code></div>
<div class="line number12 index11 alt1"><code class="php spaces"> </code><code class="php plain">test(10);                   </code><code class="php comments">//调用test函数将整数10传给参数</code></div>
<div class="line number13 index12 alt2"><code class="php plain">?&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
<p><strong>该程序执行后输出如下的结果：</strong></p>
<table class="syntaxhighlighter  php" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php plain">10 9 8 7 6 5 4 3 2 1 0 &lt;--------&gt; 0 1 2 3 4 5 6 7 8 9 10</code></div>
</div>
</td>
</tr>
</tbody>
</table>
<p>找到结果中后半部分的数字正向顺序输出的原因</p>
<p>说明：在上面的实例中声明了一个 test()函数，该函数需要一个整型的参数。在函数外面通过传递整数 10 作为参数调用 test()函数。在 test()函数体中，第一条代码输出参数的值和一个空格。然后判断条件是否成立，成立则调用自己并将参数减 1 再次传入。开始调用时，它是外层调内层，内层调更内一层，直到最内层由于条件不允许必须结束。最内存结束了，输出 &lt;--------&gt; 作为分界符，执行调用之后的代码输出参数的值和空格，它就会回到稍外一层继续执行。稍外一层在结束时，退回到在稍外一层继续执行，层层推出，直到最外层结束。执行完成以后的结果就是我们上面看到的结果。</p>
<p>树型菜单在很多桌面应用系统中都有非常广泛的应用，其主要优点是结构清晰，利于使用者非常清楚的知道目前自己所在的位置。但在web上树型菜单的应用因为没有理想的现成组件可以拿过来直接使用，所以一般的情况下，程序员主要是通过JavaScript来实现一些简单的树型结构菜单，但这些菜单往往都是事先定好各菜单项目，以及各菜单项目之间的层次关系，不利于扩充，一旦需要另一个菜单结构时，往往还需要重新编写，因此使用起来不是很方便。 <br data-filtered="filtered" /><br data-filtered="filtered" />    经过对函数递归的研究，我发现这种树型菜单可以通过递归函数，使树型菜单的显示实现动态变化，并没有级数的限制。下面就是我用php,MySQL,JavaScript写的一个动态树型菜单的处理代码，如果大家有兴趣的话，就和我一起来看看我是如何实现的吧：） <br data-filtered="filtered" /><br data-filtered="filtered" />    首先，我们需要一个数据库，在这个数据库中，我们建立以下一张表：</p>
<p class="php">CREATE TABLE menu ( <br data-filtered="filtered" />id tinyint(4) NOT NULL auto_increment, <br data-filtered="filtered" />parent_id tinyint(4) DEFAULT \\'0\\' NOT NULL, <br data-filtered="filtered" />name varchar(20), <br data-filtered="filtered" />url varchar(60), <br data-filtered="filtered" />PRIMARY KEY (id) <br data-filtered="filtered" />);</p>
<p><br data-filtered="filtered" />    这张表中 <br data-filtered="filtered" />    id 为索引 <br data-filtered="filtered" />    parent_id 用来保存上一级菜单的id号，如果是一级菜单则为0 <br data-filtered="filtered" />    name 为菜单的名称，也就是要在页面上显示的菜单内容 <br data-filtered="filtered" />    url 如果某菜单为末级菜单，则需要指定该连接的url地址，这个字段就是用来保存此地址的，其他非末级菜单，该字段为空</p>
]]></content:encoded>
			<wfw:commentRss>http://www.583idc.com/news/?feed=rss2&#038;p=1817</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
