非常精妙的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脚本的10个技巧(5)
Oct 09 PHP
PHPMYADMIN 简明安装教程 推荐
Mar 07 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
php笔记之:文章中图片处理的使用
Apr 26 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
linux中cd命令使用详解
Jan 08 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 PHP
php ajax数据传输和响应方法
Aug 21 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 PHP
laravel请求参数校验方法
Oct 10 PHP
goto语法在PHP中的使用教程
Sep 17 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
使用 MySQL Date/Time 类型
2008/03/26 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
php中上传文件的的解决方案
2018/09/25 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
jquery教程ajax请求json数据示例
2014/01/13 Javascript
理解javascript回调函数
2014/12/28 Javascript
JavaScript中this详解
2015/09/01 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Python实现句子翻译功能
2017/11/14 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
pandas针对excel处理的实现
2021/01/15 Python
西班牙自行车和跑步商店:Alltricks
2018/07/07 全球购物
一份软件工程师的面试试题
2016/02/01 面试题
材料员岗位职责
2014/03/13 职场文书
经管应届生求职信范文
2014/05/18 职场文书
新学期标语
2014/06/30 职场文书
总结Python变量的相关知识
2021/06/28 Python
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android
springcloud整合seata
2022/05/20 Java/Android
Python自动化实战之接口请求的实现
2022/05/30 Python