当前位置: 代码迷 >> PHP >> 求将一段递归代码改成非递归形式
  详细解决方案

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

热度:103   发布时间:2016-04-28 19:05:28.0
求将一段递归代码改为非递归形式

function delRecursive($id,$class_arr)
{
if($id=="") $id=0;
for($i=0;$i<count($class_arr);$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<count($class_arr);$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 < count($st));
}

function delRecursive($id, $class_arr)
{
    if($id=="") $id=0;
    for($i=0;$i<count($class_arr);$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<count($class_arr);$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 < count($st));
  相关解决方案