非常精妙的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初学入门
Nov 19 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
2014年10个最佳的PHP图像操作库
Jul 14 PHP
PHP实现的多彩标签效果代码分享
Aug 21 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 PHP
在Nginx上部署ThinkPHP项目教程
Feb 02 PHP
js代码实现微博导航栏
Jul 30 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
laravel按天、按小时,查询数据的实例
Oct 09 PHP
Laravel 不同生产环境服务器的判断实践
Oct 15 PHP
PHP const定义常量及global定义全局常量实例解析
May 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 文件状态缓存带来的问题
2008/12/14 PHP
php 启动报错如何解决
2014/01/17 PHP
浅谈php提交form表单
2015/07/01 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
JavaScript知识点整理
2015/12/09 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
python写xml文件的操作实例
2014/10/05 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
python如何实现数据的线性拟合
2019/07/19 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
明信片寄语大全
2014/04/08 职场文书
爱国主义教育活动总结
2014/05/07 职场文书
毕业设计致谢词
2015/05/14 职场文书
我是特种兵观后感
2015/06/11 职场文书
教师节简报
2015/07/20 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫