Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

PHP 递归调用一则

Posted on 2008-06-13 10:14  analyzer  阅读(548)  评论(1)    收藏  举报
http://www.gracecode.com/Main/Category/38
 1<?php   
 2// 定义 PI 一分的角度的值    
 3define("PII", M_PI/180);    
 4   
 5// 新建图像资源,并定义其背景为 白色,前景色为 黑色    
 6$im    = imagecreate(670,500);    
 7$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);    
 8$g     = imagecolorallocate($im, 0x00, 0x00, 0x00);    
 9   
10// 从下面实例化的代码可以得知,初始值 $x, $y, $L, $a 别分为 300, 500, 100, 270    
11function drawLeaf($g, $x, $y, $L, $a) {    
12    global $im;    
13    $B = 50;    
14    $C = 9;    
15    $s1 = 2;    
16    $s2 = 3 ;    
17    $s3 = 1.2;    
18    if($L > $s1) {    
19        // 计算叶子的定位 上面    
20        $x2  = $x + $L * cos($a * PII);    
21        $y2  = $y + $L * sin($a * PII);    
22        $x2R = $x2 + $L / $s2 * cos(($a + $B* PII);    
23        $y2R = $y2 + $L / $s2 * sin(($a + $B* PII);    
24        $x2L = $x2 + $L / $s2 * cos(($a - $B* PII);    
25        $y2L = $y2 + $L / $s2 * sin(($a - $B* PII);    
26   
27        // 计算叶子的定位 下面    
28        $x1  = $x + $L / $s2 * cos($a * PII);    
29        $y1  = $y + $L / $s2 * sin($a * PII);    
30        $x1L = $x1 + $L / $s2 * cos(($a - $B* PII);    
31        $y1L = $y1 + $L / $s2 * sin(($a - $B* PII);    
32        $x1R = $x1 + $L / $s2 * cos(($a + $B* PII);    
33        $y1R = $y1 + $L / $s2 * sin(($a + $B* PII);    
34   
35        // 别分画叶子的主干以及叶面    
36        ImageLine($im, (int)$x,  (int)$y,  (int)$x2,  (int)$y2,  $g);    
37        ImageLine($im, (int)$x2, (int)$y2, (int)$x2R, (int)$y2R, $g);    
38        ImageLine($im, (int)$x2, (int)$y2, (int)$x2L, (int)$y2L, $g);    
39        ImageLine($im, (int)$x1, (int)$y1, (int)$x1L, (int)$y1L, $g);    
40        ImageLine($im, (int)$x1, (int)$y1, (int)$x1R, (int)$y1R, $g);    
41   
42        // 再次递归调用本身    
43        drawLeaf($g, $x2,  $y2,  $L / $s3, $a + $C);    
44        drawLeaf($g, $x2R, $y2R, $L / $s2, $a + $B);    
45        drawLeaf($g, $x2L, $y2L, $L / $s2, $a - $B);    
46        drawLeaf($g, $x1L, $y1L, $L / $s2, $a - $B);    
47        drawLeaf($g, $x1R, $y1R, $L / $s2, $a + $B);    
48    }    
49}    
50   
51// 实例化    
52drawLeaf($g, 300, 500, 100, 270);    
53header("Content-type: image/png");    
54imagepng($im);    
55?>   
56

在我个人的 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 由于是静态变量,所以仍被保留不被释放,进而可以得到自增的值。