非常精妙的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的控制语句
Oct 09 PHP
给多个地址发邮件的类
Oct 09 PHP
PHP安装攻略:常见问题解答(二)
Oct 09 PHP
php设计模式 Interpreter(解释器模式)
Jun 26 PHP
调整优化您的LAMP应用程序的5种简单方法
Jun 26 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
Laravel框架集合用法实例浅析
May 14 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 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调用数据库的存贮过程
2006/10/09 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
javascript 二维数组的实现与应用
2010/03/16 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
js和jQuery设置Opacity半透明 兼容IE6
2016/05/24 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
Python常见数据结构详解
2014/07/24 Python
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
python3的pip路径在哪
2020/06/23 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
英国在线泳装店:Simply Swim
2019/05/05 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
迎新晚会邀请函
2014/02/01 职场文书
北京奥运会主题口号
2014/06/13 职场文书
向女朋友道歉的话
2015/01/20 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS
Vue vee-validate插件的简单使用
2021/06/22 Vue.js
python Django框架快速入门教程(后台管理)
2021/07/21 Python
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL