关于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简介
Oct 09 PHP
main.php
Dec 09 PHP
ob_start(),ob_start('ob_gzhandler')使用
Dec 25 PHP
php反弹shell实现代码
Apr 22 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
PHP jQuery表单,带验证具体实现方法
Feb 15 PHP
destoon实现资讯信息前面调用它所属分类的方法
Jul 15 PHP
PHP SPL标准库之接口(Interface)详解
May 11 PHP
编写PHP脚本过滤用户上传的图片
Jul 03 PHP
php简单压缩css样式示例
Sep 22 PHP
php生成静态页面并实现预览功能
Jun 27 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 XML数据解析代码
2010/05/26 PHP
PHP对象Object的概念 介绍
2012/06/14 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
PHP数组操作类实例
2015/07/11 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
PHP多维数组排序array详解
2017/11/21 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
javascript Event对象详解及使用示例
2013/11/22 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
JavaScript中SetInterval与setTimeout的用法详解
2015/11/10 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
在js中实现邮箱格式的验证方法(推荐)
2016/10/24 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
layui导航栏实现代码
2017/05/19 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
Python运算符重载用法实例
2015/05/28 Python
Python实现基本线性数据结构
2016/08/22 Python
python使用psutil模块获取系统状态
2016/08/27 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
如何用PHP实现多线程编程
2021/05/26 PHP
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL