非常精妙的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脚本数据库功能详解(上)
Oct 09 PHP
配置支持SSI
Nov 25 PHP
js下函数般调用正则的方法附代码
Jun 22 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
php常用字符串比较函数实例汇总
Nov 24 PHP
THINKPHP项目开发中的日志记录实例分析
Dec 01 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
Nov 18 PHP
php采集神器cURL使用方法详解
Feb 19 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
Oct 29 PHP
php中的抽象方法和抽象类
Feb 14 PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
做一个有下拉功能的留言版
2006/10/09 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
PHP操作mysql数据库分表的方法
2016/06/09 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
详解Python中类的定义与使用
2017/04/11 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
新教师岗前培训方案
2014/06/05 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
python开发实时可视化仪表盘的示例
2021/05/07 Python
Go语言基础map用法及示例详解
2021/11/17 Golang