php递归算法经典实例
来源:互联网 发布:华中师范网络教育 编辑:程序博客网 时间:2024/05/22 12:16
http://www.111cn.net/phper/php-cy/93178.htm
递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲解,还是很难明白,直接上例子
function test ($n){echo $n." ";if($n>0){test($n-1);}else{echo "<?>";} echo $n.''}test(2)
这个例子最终的输出结果是2 1 0<?>0 1 2
我解释下 为何输出是这样的
第一步,执行test(2),echo 2,然后因为2>0,执行test(1), 后面还有没来得及执行的echo 2
第二步,执行test(1),echo 1,然后因为1>0,执行test(0),同样后面还有没来得及执行的 echo 1
第三步,执行test(0),echo 0,执行test(0),echo 0, 此时0>0的条件不满足,不在执行test()函数,而是echo “<?>”,并且执行后面的 echo 0
此时函数已经不再调用自己,开始将流程的主控权交回给上一层函数来执行,也就是开始执行刚刚所有test()函数没来得及输出的最后一个echo,0的一层是1也就是输出1 1的上一层是2 也就是输出2 2没有山一层 所以呢 输出的内容就是2 1 0<?>0 1 2
如何考虑用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; }
中序遍历二叉树
void inorder (BinTree T){ if (T){ inorder(T->lchild); printf(“%c”,T->data); inorder(T->rchild); } }
Mysql
首先我们准备一张数据表class,记录商品分类信息。表中有三个字段,id:分类编号,主键自增长;title:分类名称;pid:所属上级分类id。
class表结构:
CREATE TABLE IF NOT EXISTS `class` ( id` mediumint(6) NOT NULL AUTO_INCREMENT, `title` varchar(30) NOT NULL, `pid` mediumint(6) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
插入数据后,如图:
根据不同的需求,我们提供两种不同格式的自定义函数,一种是返回字符串,一种是返回数组,两种函数都使用了递归方法。先看返回字符串格式的函数:
function
get_str(
$id
= 0) {
global
$str
;
$sql
=
"<a href="
\"/tags.php/select/\"
" target="
\"_blank\"
">select</a> id,title from class where pid= $id"
;
$result
= mysql_query(
$sql
);
//查询pid的子类的分类
if
(
$result
&& mysql_affected_rows()){
//如果有子类
$str
.=
'<ul>'
;
while
(
$row
= mysql_fetch_array(
$result
)) {
//循环记录集
$str
.=
"<li>"
.
$row
[
'id'
] .
"--"
.
$row
[
'title'
] .
"</li>"
;
//构建字符串
get_str(
$row
[
'id'
]);
//调用get_str(),将记录集中的id参数传入函数中,继续查询下级
}
$str
.=
'</ul>'
;
}
return
$str
;
}
以上函数get_str()通过递归,不断查询下级分类,并最终返回字符串,大家可以根据项目需求修改其中的str,最终生成一个无限分级列表:
<a href=
"\"/tags.php/include/\""
target=
"\"_blank\""
>
include
</a>_once(
'connect.php'
);
//连接<a href="\"/database/database.html\"" target="\"_blank\"">数据库</a>,connect.php文件自己写一个啊
echo
get_str(0);
//输出无限级分类
效果如:
接着我们来看返回数组格式的函数,一样要使用递归:
function
get_array(
$id
=0){
$sql
=
"select id,title from class where pid= $id"
;
$result
= mysql_query(
$sql
);
//查询子类
$arr
=
array
();
if
(
$result
&& mysql_affected_rows()){
//如果有子类
while
(
$rows
=mysql_fetch_assoc(
$result
)){
//循环记录集
$rows
[
'list'
] = get_array(
$rows
[
'id'
]);
//调用函数,传入参数,继续查询下级
$arr
[] =
$rows
;
//组合数组
}
return
$arr
;
}
}
函数get_array()返回了数组,这是我们期待的,所以笔者推荐使用get_array()得到数组,这样一来,我们可以对数组进行任意操作,比如我们可以将数组转换成json格式的数据传给前端页面,前端页面可以通过解析json数据灵活展示分类信息。比如树形结构的分类列表,下拉分类列表等。
include_once
(
'connect.php'
);
//连接数据库
$list
= get_array(0);
//调用函数
print_r(
$list
);
//输出数组
如果要输出json格式的数据,则可使用:
echo
json_encode(
$list
);
- php递归算法经典实例
- 递归算法经典实例
- C++递归算法经典实例详解
- 递归算法及经典实例----转载啦~
- PHP递归算法的简单实例
- 一个经典的递归算法题(实例+源码)
- TreeView(经典递归算法)
- 递归算法经典列子
- 经典递归算法,汉诺塔
- 汉诺塔算法(经典递归)
- 经典汉诺塔递归算法
- 经典递归算法
- 递归算法经典例题
- PHP递归算法的一个实例 帮助理解
- php递归实例
- 递归算法实例讲解
- 递归算法实例
- 递归算法实例讲解
- 上拉加载下拉刷新方法-ApiCloud学习笔记
- 特征提取算法--ORB
- 双击返回键退出-ApiCloud学习笔记
- Oracle换行
- vue-cli简单使用心得
- php递归算法经典实例
- Ruby on Rails笔记(一) Getting Started
- 一步一步学Spring-通过xml装配bean
- 黑板客 -- 爬虫闯关 -- 关卡05
- 【笃行】iOS 开发中的问题
- miniUI打开一个新的画面
- golang
- (转)虚拟货币交易所时代结束
- linux node.js安装