课程咨询 :027-87185216 QQ:2490085651

武汉PHP培训 > 达内新闻 > 非常精妙的 PHP 递归调用 代码
  • 非常精妙的 PHP 递归调用 代码

    发布:第一PHP社区      来源:第一PHP社区      时间:2016-06-23

  • <?php
    // 定义 PI 一分的角度的值
    define("PII", 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 > $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("Content-type: image/png");
    imagepng($im);
    ?>

    在我个人的 PHP 编程经验中,递归调用常常与静态变量使用。静态变量的含义可以参考 PHP 手册。希望下面的代码,会更有利于对递归以及静态变量的理解

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

    推荐文章

上一篇:由 php 中 if 想到的些问题

下一篇: PHP V5.3在Unicode方面新特征的介绍

最新开班日期  |  更多

PHP高级开发工程师定制班

PHP高级开发工程师定制班

开班日期:4/28

PHP高级开发工程师周末班

PHP高级开发工程师周末班

开班日期:4/28

PHP高级开发工程师精品班

PHP高级开发工程师精品班

开班日期:4/28

PHP高级开发工程师就业班

PHP高级开发工程师就业班

开班日期:4/28

  • 地址:武汉市洪山区洪山亚贸广场B座12楼
  • 课程培训电话:027-87185216 QQ:2490085651     全国服务监督电话:400-111-8989
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56