关于PHP递归算法和应用方法介绍


Posted in PHP onApril 15, 2013

PHP作为开发动态页面WEB的首选技术,对于它的基础知识我们一定要牢记,这让才能有助于编程。我们一起来看看PHP递归算法是怎么回事吧。

1、调用子程序的含义:

当主程序执行到调用子程序A语句时,系统保存一些必要的现场数据,然后执行类似于BASIC语言的GOTO语句,跳转到子程序A(为了说得简单些,我这里忽略了参数传递这个过程)。当子程序A执行到调用子程序B语句时,系统作法如上,跳转到子程序B。子程序B执行完所有语句后,跳转回子程序A调用子程序B语句的下一条语句(我这又忽略了返回值处理)子程序A执行完后,跳转回主程序调用子程序A语句的下一条语句,主程序执行到结束。做个比较:我在吃饭(执行主程序)吃到一半时,某人叫我(执行子程序A),话正说到一半,电话又响了起来(执行子程序B),我只要先接完电话,再和某人把话说完,最后把饭吃完(我这饭吃得也够累的了J)。

2、认识递归函数

我们在高中时都学过数学归纳法,PHP递归算法例如:

求 n!我们可以把n!这么定义也就是说要求3!,我们必须先求出2!,要求2!,必须先求1!,要求1!,就必须先求0!,而0!=1,所以1!=0!*1=1,再进而求2!,3!。分别用函数表示,我们可以观察到,除计算0!子程序外,其他的子程序基本相似,我们可以设计这么一个子程序:

int factorial(int i){  
int res;  
res=factorial(I-1)*i;  
return res;  
}
那么当执行主程序语句s=factorial(3)时,就会执行factorial(3),但在执行factorial(3),又会调用 factorial(2),这时大家要注意,factorial(3)和factorial(2)虽然是同一个代码段,但在内存中它的数据区是两份!而执行factorial(2)时又会调用factorial(1),执行factorial(1)时又会调用factorial(0),每调用一次 factorial函数,它就会在内存中新增一个数据区,那么这些复制了多份的函数大家可以把它看成是多个不同名的函数来理解;但我们这个函数有点问题,在执行factorial(0)时,它又会调用factorial(-1)。。。造成死循环,也就是说,在factorial函数中,我们要在适当的时候保证不再调用该函数,也就是不执行res=factorial(I-1)*i;这条调用语句。所以函数要改成:

int factorial(int i){  
int res;  
if (I>0) res=factorial(I-1)*i; else res=1;  
return res;  
}
3、如何考虑用PHP递归算法来解决问题

例:求s=1+2+3+4+5+6+……+n本来这个问题我们过去常用循环累加的方法。而这里如要用递归的方法,必须考虑两点:
1) 能否把问题转化成递归形式的描述;
2) 是否有递归结束的边界条件。

显然递归的两个条件都有了:

1) s(n) =s(n-1)+n  
2) s(1)=1
所以源程序为:

int progression(int n){  
int res;  
if (n=1 )res=1 else res=progression(n-1)+n;  
return res;  
}
4、递归的应用

中序遍历二叉树

void inorder (BinTree T){  
if (T){  
inorder(T->lchild);  
printf(“%c”,T->data);  
inorder(T->rchild);  
}  
}

PHP 相关文章推荐
PHP源码之 ext/mysql扩展部分
Jul 17 PHP
IIS6.0中配置php服务全过程解析
Aug 07 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
Mar 17 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
PHP实现获取图片颜色值的方法
Jul 11 PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 PHP
php实现简单文件下载的方法
Jan 30 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
php常用字符函数实例小结
Dec 29 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
May 29 PHP
PHP 读取Postgresql中的数组
Apr 14 #PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 #PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 #PHP
php检测图片木马多进制编程实践
Apr 11 #PHP
谈谈关于php的优点与缺点
Apr 11 #PHP
如何用PHP实现插入排序?
Apr 10 #PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 #PHP
You might like
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
jQuery上传多张图片带进度条样式(DEMO)
2017/03/02 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
python实现代理服务功能实例
2013/11/15 Python
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
大学生就业自我鉴定
2013/10/26 职场文书
优秀党员主要事迹
2014/01/19 职场文书
财产公证书
2014/04/10 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android
MySQL里面的子查询的基本使用
2021/08/02 MySQL