关于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和ACCESS写聊天室(三)
Oct 09 PHP
如何使用脚本模仿登陆过程
Nov 22 PHP
PHP操作mysql函数详解,mysql和php交互函数
May 19 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
Jun 14 PHP
更改localhost为其他名字的方法
Feb 10 PHP
php不写闭合标签的好处
Mar 04 PHP
php中substr()函数参数说明及用法实例
Nov 15 PHP
php实现约瑟夫问题的方法小结
Mar 23 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
Dec 28 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 PHP
关于PHP5.6+版本“No input file specified”问题的解决
Dec 11 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
一个很不错的PHP翻页类
2009/06/01 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
Python numpy 常用函数总结
2017/12/07 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
企业精神口号
2014/06/11 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
要账委托书范本
2014/09/15 职场文书
党员承诺书格式范文
2015/04/28 职场文书
教师节祝酒词
2015/08/11 职场文书