非常精妙的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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
PHP写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
php 全局变量范围分析
Aug 07 PHP
PHP操作XML作为数据库的类
Dec 19 PHP
如何修改和添加Apache的默认站点目录
Jul 05 PHP
php检测useragent版本示例
Mar 24 PHP
php环境套包 dedeampz 伪静态设置示例
Mar 26 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
Jul 02 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
Oct 17 PHP
PHP网站自动化配置的实现方法(必看)
May 27 PHP
PHP架构及原理知识点详解
Dec 22 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和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
php时间计算相关问题小结
2016/05/09 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
document.getElementBy(&quot;id&quot;)与$(&quot;#id&quot;)有什么区别
2013/09/22 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
利用pandas读取中文数据集的方法
2018/07/25 Python
python numpy元素的区间查找方法
2018/11/14 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
介绍一下gcc特性
2012/01/20 面试题
高二英语教学反思
2014/01/19 职场文书
师范生见习自我总结
2015/06/23 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
学术会议开幕词
2016/03/03 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS
讲解MySQL增删改操作
2022/05/06 MySQL