<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml xml:lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/vnd.wap.wml; charset=utf-8"/>
<meta http-equiv="Cache-Control" content="no-cache"/></head>
<card title="PHP 递归调用一则 - Gracecode.com">
<p><img src="http://pic.yupoo.com/feelinglucky/33113574f661/medium.jpg" alt="http://pic.yupoo.com/feelinglucky/33113574f661/medium.jpg" title="http://pic.yupoo.com/feelinglucky/33113574f661/medium.jpg" /></p>

<p>从 <a href="http://echoright.blog.sohu.com/76507129.html" title="http://echoright.blog.sohu.com/76507129.html">Echoright 大哥的 Blog 上看到这则</a>非常精妙的 PHP 代码。</p>

<pre>&lt;?php
// 定义 PI 一分的角度的值
define(&quot;PII&quot;, M_PI/180);

// 新建图像资源，并定义其背景为 白色，前景色为 黑色
$im    = imagecreate(670,500);
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
$g     = imagecolorallocate($im, 0x00, 0x00, 0x00);

// 从下面实例化的代码可以得知，初始值 $x, $y, $L, $a 别分为 300, 500, 100, 270
function drawLeaf($g, $x, $y, $L, $a) {
    global $im;
    $B = 50;
    $C = 9;
    $s1 = 2;
    $s2 = 3 ;
    $s3 = 1.2;
    if($L &gt; $s1) {
        // 计算叶子的定位 上面
        $x2  = $x + $L * cos($a * PII);
        $y2  = $y + $L * sin($a * PII);
        $x2R = $x2 + $L / $s2 * cos(($a + $B) * PII);
        $y2R = $y2 + $L / $s2 * sin(($a + $B) * PII);
        $x2L = $x2 + $L / $s2 * cos(($a - $B) * PII);
        $y2L = $y2 + $L / $s2 * sin(($a - $B) * PII);

        // 计算叶子的定位 下面
        $x1  = $x + $L / $s2 * cos($a * PII);
        $y1  = $y + $L / $s2 * sin($a * PII);
        $x1L = $x1 + $L / $s2 * cos(($a - $B) * PII);
        $y1L = $y1 + $L / $s2 * sin(($a - $B) * PII);
        $x1R = $x1 + $L / $s2 * cos(($a + $B) * PII);
        $y1R = $y1 + $L / $s2 * sin(($a + $B) * PII);

        // 别分画叶子的主干以及叶面
        ImageLine($im, (int)$x,  (int)$y,  (int)$x2,  (int)$y2,  $g);
        ImageLine($im, (int)$x2, (int)$y2, (int)$x2R, (int)$y2R, $g);
        ImageLine($im, (int)$x2, (int)$y2, (int)$x2L, (int)$y2L, $g);
        ImageLine($im, (int)$x1, (int)$y1, (int)$x1L, (int)$y1L, $g);
        ImageLine($im, (int)$x1, (int)$y1, (int)$x1R, (int)$y1R, $g);

        // 再次递归调用本身
        drawLeaf($g, $x2,  $y2,  $L / $s3, $a + $C);
        drawLeaf($g, $x2R, $y2R, $L / $s2, $a + $B);
        drawLeaf($g, $x2L, $y2L, $L / $s2, $a - $B);
        drawLeaf($g, $x1L, $y1L, $L / $s2, $a - $B);
        drawLeaf($g, $x1R, $y1R, $L / $s2, $a + $B);
    }
}

// 实例化
drawLeaf($g, 300, 500, 100, 270);
header(&quot;Content-type: image/png&quot;);
imagepng($im);
?&gt;</pre><p>在我个人的 PHP 编程经验中，递归调用常常与静态变量使用。静态变量的含义可以参考 PHP 手册。希望下面的代码，会更有利于对递归以及静态变量的理解</p>

<pre>header(&quot;Content-type: text/plain&quot;);
function static_function () {
    static $i = 0;
    if ($i++ &lt; 10) {
        echo $i . &quot;\n&quot;;
        static_function();
    }
}
static_function();</pre><p>这段代码会如数输出 1 到 10 的数字。在 static_function 函数第二次运行时，变量 i 由于是静态变量，所以仍被保留不被释放，进而可以得到自增的值。</p>


<p>
<a href="http://www.gracecode.com/wap/">Gracecode.com</a> |
<a href="http://www.gracecode.com/wap/d/1454 ">Permalink</a>(<a href="http://www.gracecode.com/Archive/Display/1454 ">xHTML</a>) |
<a href="http://www.gracecode.com/Trackback/Recieve/1454/ni4t71">Trackback</a> |
<a href="http://rss.gracecode.com">Rss</a>
</p>
</card>
</wml>