非常精妙的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中利用XML技术构造远程服务(上)
Oct 09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续四
Apr 03 PHP
PHP clearstatcache()函数详解
Mar 02 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
php中session_unset与session_destroy的区别分析
Jun 16 PHP
一个典型的PHP分页实例代码分享
Jul 28 PHP
PHP filter_var() 函数 Filter 函数
Apr 25 PHP
使用PHP Socket 编程模拟Http post和get请求
Nov 25 PHP
php实现过滤UBB代码的类
Mar 12 PHP
详解Yii2.0 rules验证规则集合
Mar 21 PHP
php使用pecl方式安装扩展操作示例
Aug 12 PHP
php给数组赋值的实例方法
Sep 26 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中用文本文件做数据库的实现方法
2008/03/27 PHP
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
JS中Location使用详解
2015/05/12 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
antd Upload 文件上传的示例代码
2018/12/14 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
JS实现音量控制拖动
2020/01/15 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
Python实现的质因式分解算法示例
2018/05/03 Python
python获取交互式ssh shell的方法
2019/02/14 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
django 取消csrf限制的实例
2020/03/13 Python
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
管理失职检讨书
2014/02/12 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
公司表扬稿范文
2015/05/05 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android