欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

求将一段递归代码改成非递归形式

程序员文章站 2022-06-08 09:20:24
...
求将一段递归代码改为非递归形式

function delRecursive($id,$class_arr)
{
if($id=="") $id=0;
for($i=0;$i if($class_arr[$i][3]==$id){
$subid=$class_arr[$i][0];
$this->db->delete('tree', array('id' => $id));
$this->db->delete('tree', array('id' => $subid));
delRecursive($subid,$class_arr);
}
}
}

------解决方案--------------------
怎么就不知道与人方便,与己方便的道理呢?

消除递归就是用自己的堆栈,代替系统的堆栈
$ar = array(
array( "1", "0", "*分类1", "0", "1"),
array("713", "0", "*分类2", "0", "1"),
array("716", "0", "一级子分类1", "713", "1"),
array("718", "0", "*分类3", "0", "1"),
array("721", "0", "二级子分类1", "716", "1"),
);

$id = 713;
delRecursive($id, $ar);
func($id, $ar);

function func($id, $class_arr)
{
if($id=="") $id=0;
$st = array($id);
do {
$cnt = count($st);
for($i=0;$i if(in_array($id = $class_arr[$i][3], $st)){
$subid=$class_arr[$i][0];
if(! in_array($subid, $st)) {
$st[] = $subid;
echo "$id,$subid\n";
// $this->db->delete('tree', array('id' => $id));
// $this->db->delete('tree', array('id' => $subid));
// delRecursive($subid,$class_arr);
}
}
}
}while($cnt }

function delRecursive($id, $class_arr)
{
if($id=="") $id=0;
for($i=0;$i if($class_arr[$i][3]==$id){
$subid=$class_arr[$i][0];
// $this->db->delete('tree', array('id' => $id));
// $this->db->delete('tree', array('id' => $subid));
echo "$id,$subid\n";
delRecursive($subid,$class_arr);
}
}
}

------解决方案--------------------

$st = array($id);
do {
$cnt = count($st);
for($i=0;$i if(in_array($class_arr[$i][3], $st)){
$subid=$class_arr[$i][0];
if(!in_array($subid, $st)) {
$st[] = $subid;
$this->DB_MT->delete('tree', array('id' => $id));
$this->DB_MT->delete('tree', array('id' => $subid));
}
}
}
}while($cnt