非常精妙的PHP递归调用与静态变量使用


Posted in PHP onDecember 16, 2012
<?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 相关文章推荐
php时间不正确的解决方法
Apr 09 PHP
PHP设置一边执行一边输出结果的代码
Sep 30 PHP
教你如何使用php session
Oct 28 PHP
php使用explode()函数将字符串拆分成数组的方法
Feb 17 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
分享PHP守护进程类
Dec 30 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
Apr 23 PHP
php curl中gzip的压缩性能测试实例分析
Nov 08 PHP
PHP yii实现model添加默认值的方法(两种方法)
Nov 10 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
TP5多入口设置实例讲解
Dec 15 PHP
PHP--用万网的接口实现域名查询功能
Dec 13 #PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 #PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 #PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 #PHP
zend framework配置操作数据库实例分析
Dec 06 #PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 #PHP
用Simple Excel导出xls实现方法
Dec 06 #PHP
You might like
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
需要注意的几个PHP漏洞小结
2012/02/05 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
php7下的filesize函数
2019/09/30 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
在Django的视图中使用form对象的方法
2015/07/18 Python
深入浅析Python传值与传址
2018/07/10 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
空指针到底是什么
2012/08/07 面试题
一些Unix笔试题和面试题
2013/01/22 面试题
个人职业生涯规划书1500字
2013/12/31 职场文书
大学新生欢迎词
2014/01/10 职场文书
小班幼儿评语大全
2014/04/30 职场文书
大学生自荐信范文
2015/03/05 职场文书
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js