非常精妙的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 相关文章推荐
dedecms后台验证码总提示错误的解决方法
Mar 21 PHP
PHP-MySQL教程归纳总结
Jun 07 PHP
php学习 函数 课件
Jun 15 PHP
纯真IP数据库的应用 IP地址转化成十进制
Jun 14 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
解析thinkphp基本配置 convention.php
Jun 18 PHP
5种PHP创建数组的实例代码分享
Jan 17 PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
Jul 25 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
解决nginx不支持thinkphp中pathinfo的问题
Jul 21 PHP
thinkPHP5.0框架命名空间详解
Mar 18 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
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
php实现Mysql简易操作类
2015/10/11 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
jquery tools之tooltip
2009/07/25 Javascript
JavaScript的变量作用域深入理解
2009/10/25 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
python下如何让web元素的生成更简单的分析
2008/07/17 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
Python使用folium excel绘制point
2019/01/03 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
python异步Web框架sanic的实现
2020/04/27 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
门卫班长岗位职责
2013/12/15 职场文书
设计师个人求职信范文
2014/02/02 职场文书
爱国主义电影观后感
2015/06/18 职场文书
开票证明
2015/06/23 职场文书
高中军训感想
2015/08/07 职场文书