非常精妙的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同时支持GIF、png、JPEG
Oct 09 PHP
隐性调用php程序的方法
Mar 09 PHP
火车头discuz6.1 完美采集的php接口文件
Sep 13 PHP
PHP 根据IP地址控制访问的代码
Apr 22 PHP
php实现简单洗牌算法
Jun 18 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
Jun 23 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
Nov 27 PHP
php中Array2xml类实现数组转化成XML实例
Dec 08 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
PHP命名空间简单用法示例
Dec 28 PHP
PHP autoload使用方法及步骤详解
Sep 05 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代码简化
2010/02/08 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
php中__toString()方法用法示例
2016/12/07 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
python修改字典内key对应值的方法
2015/07/11 Python
浅谈Python基础之I/O模型
2017/05/11 Python
python编写弹球游戏的实现代码
2018/03/12 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
python字典的常用方法总结
2019/07/31 Python
python实现堆排序的实例讲解
2020/02/21 Python
python如何输出反斜杠
2020/06/18 Python
python3代码中实现加法重载的实例
2020/12/03 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
音乐器材管理制度
2014/01/31 职场文书
《雪儿》教学反思
2014/04/17 职场文书
文明村镇申报材料
2014/05/06 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
工作证明书
2015/06/15 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
导游词之江南周庄
2019/12/06 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python