php递归算法经典实例

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;

插入数据后,如图:

php递归算法经典实例

 根据不同的需求,我们提供两种不同格式的自定义函数,一种是返回字符串,一种是返回数组,两种函数都使用了递归方法。先看返回字符串格式的函数:

1
2
3
4
5
6
7
8
9
10
11
12

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,最终生成一个无限分级列表:

1
2
3
<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);  //输出无限级分类

效果如: 

php递归算法经典实例

接着我们来看返回数组格式的函数,一样要使用递归:

1
2
3
4
5
6
7
8
9
10
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数据灵活展示分类信息。比如树形结构的分类列表,下拉分类列表等。

1
2
3
include_once ( 'connect.php' );  //连接数据库 
$list  = get_array(0);  //调用函数 
print_r( $list );  //输出数组

如果要输出json格式的数据,则可使用: 

php递归算法经典实例

1
echo  json_encode( $list );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值