非常精妙的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在线打包程序源码
Jul 27 PHP
快速开发一个PHP扩展图文教程
Dec 12 PHP
关于Appserv无法打开localhost问题的解决方法
Oct 16 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 PHP
PHP获取一个字符串中间一部分字符的方法
Aug 19 PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 PHP
PHP设计模式之原型模式定义与用法详解
Apr 03 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP 对象继承原理与简单用法示例
Apr 21 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读取csc文件并输出
2015/05/21 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
ext实现完整的登录代码
2008/08/08 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
当鼠标移动时出现特效的JQuery代码
2013/11/08 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
Vue.js实现tab切换效果
2019/07/24 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
35个Python编程小技巧
2014/04/01 Python
自己使用总结Python程序代码片段
2015/06/02 Python
Python修改MP3文件的方法
2015/06/15 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
Python中交换两个元素的实现方法
2018/06/29 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
应聘英语教师求职信
2014/04/24 职场文书
党的群众路线调研报告
2014/11/03 职场文书
个人德育工作总结
2015/03/05 职场文书
运动会报道稿大全
2015/07/23 职场文书
感恩的心主题班会
2015/08/12 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
使用Python获取字典键对应值的方法
2022/04/26 Python