非常精妙的 PHP 递归调用 代码

 

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

时间: 2024-12-27 11:03:53

非常精妙的 PHP 递归调用 代码的相关文章

怎么在递归调用中让其中一部分代码只运行一次

问题描述 怎么在递归调用中让其中一部分代码只运行一次 怎么在递归调用中让其中一部分代码只运行一次. 怎么在递归调用中让其中一部分代码只运行一次

java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题

/* 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 */ import static java.lang.System.out; public class PersonDemo { public static void main(String[] args) { //*********测试父类与子类之间的循环调用的问题 out.println("main1&quo

PHP递归调用的小技巧讲解

在PHP的实际编码中,当我们需要实现多元数组替换功能时,就会遇到PHP递归调用.那么具体的使用方式是怎样的呢?下面我们将通过一段代码示例来具体分析一下实现这以功能的方法. PHP递归调用实现多元数组替换功能代码示例: < ?php $arr = array(array("< 小刚>","< 小晓>"),"< 小飞>","< 小李>","< 小红>&qu

php递归调用删除数组空值元素的方法

  本文实例讲述了php递归调用删除数组空值元素的方法.分享给大家供大家参考.具体如下: 该函数可以删除数组里的所有空值元素,包含空字符串,空的数组等等. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function array_remove_empty($arr){ $narr = array(); while(list($key, $val) = each($arr)){ if (is_array($val)){ $val = a

ant实现macrodef递归调用,property无法更新导致死循环,求助

问题描述 ant实现macrodef递归调用,property无法更新导致死循环,求助 在代码中: 1.使用 标签获取一个url的文件 2.然后用获取文件的内容 3.我会根据make_state的值去判断是否递归调用,然而我们都知道property是常量,所以我的make_state的值会一直满足递归条件导致死循环 4.后来我就设置了一个想每次递归调用的时候传一个值进来作为变量的名字 于是修改为 在递归调用的时候就想传一个不断变化的值进去作为变量的名字 5.我尝试过时间戳啥的,比如${DSTAM

PHP 无限分类三种方式 非函数的递归调用!_php技巧

php无限分类大致有三种方式, 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行排列,然后使用mysql查询关键函数:concat.程序实现比较简单: 3.第三种不是太了解, 好像要使用到算法和数据结构进行排列. 今天我主要分享下第二种方式,一开始也是找了很多资料,确实比较难理解.不过最终还是给搞明白了,因此记下随笔,希望通过这篇文章能够帮助到大家. 一.数据库设计: 复制代码 代码如下: -- -- Table structure

php递归调用删除数组空值元素的方法_php技巧

本文实例讲述了php递归调用删除数组空值元素的方法.分享给大家供大家参考.具体如下: 该函数可以删除数组里的所有空值元素,包含空字符串,空的数组等等. function array_remove_empty($arr){ $narr = array(); while(list($key, $val) = each($arr)){ if (is_array($val)){ $val = array_remove_empty($val); // does the result array conta

JavaScript支持的最大递归调用次数分析_javascript技巧

你对JavaScript引擎能进行多少次递归调用好奇吗? 多少次递归调用 下面的函数可以让你找到答案: (灵感来自Ben Alman的 gist) 复制代码 代码如下: function computeMaxCallStackSize() {     try {         return 1 + computeMaxCallStackSize();     } catch (e) {         // Call stack overflow         return 1;     }

递归-java代码放到安卓里运行有误!

问题描述 java代码放到安卓里运行有误! 一个处理字符串的java类改装后放到安卓里使用,安卓程序秒退! 此java代码涉及递归调用.静态变量! 求大神解释为什么? 解决方案 断点监听一下就可以啊,你这不上代码怎么看 解决方案二: debug一下....... 解决方案三: 能把代码贴出来看看么 解决方案四: 估计是引用的包有冲突 解决方案五: 运行文件名对了吗??? 解决方案六: 具体原因要看代码,发一下代码 解决方案七: 我一般的迁移代码是先方法测试,再单元测试,在联合集成,容易定位问题.