Heim > php教程 > PHP源码 > php递归算法经典实例

php递归算法经典实例

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-08 17:20:07
Original
4310 Leute haben es durchsucht

PHP递归算法就是函数调用函数了操作非常的简单了,我们下面来给各位介绍PHP递归算法及实际的一些关于递归的用法。

<script>ec(2);</script>

递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲解,还是很难明白,直接上例子

function test ($n){

echo $n.”  “;

if($n>0){

test($n-1);

}else{

echo “<?>”;

}

echo $n.”  ”

}

test(2)
Nach dem Login kopieren

这个例子最终的输出结果是2 1 00 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 00 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;   

}
Nach dem Login kopieren

中序遍历二叉树

void inorder (BinTree T){   

if (T){   

inorder(T->lchild);   

printf(“%c”,T->data);   

inorder(T->rchild);   

}   

}
Nach dem Login kopieren

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 &#39;0&#39;, 

  PRIMARY KEY (`id`) 

) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
Nach dem Login kopieren

插入数据后,如图:

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

function get_str($id = 0) { 

    global $str; 

    $sql = "select id,title from class where pid= $id";  

    $result = mysql_query($sql);//查询pid的子类的分类 

    if($result && mysql_affected_rows()){//如果有子类 

        $str .= &#39;<ul>&#39;; 

        while ($row = mysql_fetch_array($result)) { //循环记录集 

            $str .= "<li>" . $row[&#39;id&#39;] . "--" . $row[&#39;title&#39;] . "</li>"; //构建字符串 

            get_str($row[&#39;id&#39;]); //调用get_str(),将记录集中的id参数传入函数中,继续查询下级 

        } 

        $str .= &#39;</ul>&#39;; 

    } 

    return $str; 

}
Nach dem Login kopieren

以上函数get_str()通过递归,不断查询下级分类,并最终返回字符串,大家可以根据项目需求修改其中的str,最终生成一个无限分级列表:

include_once(&#39;connect.php&#39;); //连接数据库,connect.php文件自己写一个啊 

echo get_str(0); //输出无限级分类
Nach dem Login kopieren

效果如:

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

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[&#39;list&#39;] = get_array($rows[&#39;id&#39;]); //调用函数,传入参数,继续查询下级 

            $arr[] = $rows; //组合数组 

        } 

        return $arr; 

    } 

}
Nach dem Login kopieren

函数get_array()返回了数组,这是我们期待的,所以笔者推荐使用get_array()得到数组,这样一来,我们可以对数组进行任意操作,比如我们可以将数组转换成json格式的数据传给前端页面,前端页面可以通过解析json数据灵活展示分类信息。比如树形结构的分类列表,下拉分类列表等。

include_once(&#39;connect.php&#39;); //连接数据库 

$list = get_array(0); //调用函数 

print_r($list); //输出数组
Nach dem Login kopieren

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

echo json_encode($list);
Nach dem Login kopieren

 

Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage