关于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 相关文章推荐
构建简单的Webmail系统
Oct 09 PHP
PHP获取php,mysql,apche的版本信息示例代码
Jan 16 PHP
php导出excel格式数据问题
Mar 11 PHP
Codeigniter(CI)框架分页函数及相关知识
Nov 03 PHP
PHP SOCKET编程详解
May 22 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
PHP的几个常用加密函数
Feb 03 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
round robin权重轮循算法php实现代码
May 28 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 PHP
php时间戳转换代码详解
Aug 04 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 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代码
2012/09/14 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
js的event详解。
2006/09/06 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
React中的refs的使用教程
2018/02/13 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
编程语言Python的发展史
2014/09/26 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
python冒泡排序简单实现方法
2015/07/09 Python
详解Django中的过滤器
2015/07/16 Python
python之Character string(实例讲解)
2017/09/25 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
python使用selenium实现批量文件下载
2019/03/11 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
Python如何实现强制数据类型转换
2019/11/22 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
NET程序员上机面试题
2015/05/23 面试题
中秋节礼品促销方案
2014/02/02 职场文书
设备收款委托书范本
2014/10/02 职场文书