非常精妙的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 Token(令牌)设计
Mar 15 PHP
php学习笔记 类的声明与对象实例化
Jun 13 PHP
php代码审计比较有意思的例子
May 07 PHP
THINKPHP内容分页代码分享
Jan 14 PHP
php中动态变量用法实例
Jun 10 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
PHP实现随机数字、字母的验证码功能
Aug 01 PHP
PDO::setAttribute讲解
Jan 29 PHP
php的无刷新操作实现方法分析
Feb 28 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版微信公众号接口实现发红包的方法
2016/10/14 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
python类定义的讲解
2013/11/01 Python
Python 的 with 语句详解
2014/06/13 Python
python使用urlparse分析网址中域名的方法
2015/04/15 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
Python 实现一个计时器
2020/07/28 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
学习心得体会
2014/01/01 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
股东出资证明书范例
2014/10/04 职场文书
初婚初育证明范本
2014/11/24 职场文书
2015年教研工作总结
2015/05/23 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书