关于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 相关文章推荐
解析dedeCMS验证码的实现代码
Jun 07 PHP
web server使用php生成web页面的三种方法总结
Oct 28 PHP
PHP+javascript制作带提示的验证码源码分享
May 28 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
PHPCMS V9 添加二级导航的思路详解
Oct 20 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
Apr 26 PHP
Laravel框架实现的记录SQL日志功能示例
Jun 19 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 PHP
PHP如何使用array_unshift()在数组开头插入元素
Sep 01 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 求质素(素数) 的实现代码
2011/04/12 PHP
php中文字符串截取方法实例总结
2014/09/30 PHP
接收键盘指令的脚本
2006/06/26 Javascript
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
js实现文字截断功能
2016/09/14 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
python实现按行切分文本文件的方法
2016/04/18 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
python系列 文件操作的代码
2019/10/06 Python
Python字符串的修改方法实例
2019/12/19 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
名词解释型面试题(主要是网络)
2013/12/27 面试题
Laravel中Kafka的使用详解
2021/03/24 PHP
可口可乐广告词
2014/03/20 职场文书
《桥》教学反思
2014/04/09 职场文书
授权委托书格式
2014/07/31 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
文明礼仪主题班会
2015/08/13 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏
python pygame 开发五子棋双人对弈
2022/05/02 Python