跪求高手支教如何理解递归!

解决方案 »

  1.   

    递归其实就是“一个函数的自调用”
    在这个“自调用”的过程中,必须要有一个变化的“参数”,当这个“参数”达到你的期望值的时候,终止该“自调用”过程
    例举下面这个php程序,为了方便楼主好理解,特以描叙Linux目录3级递归结构为例,希望对你有所帮助。<?  //递归 三级目录结构
    $arr = array(
        array('id'=>1,'city_name'=>'/','rel_id'=>'根目录','pid'=>0), 
        array('id'=>2,'city_name'=>'/home','rel_id'=>'用户目录','pid'=>1),
        array('id'=>3,'city_name'=>'/home/www','rel_id'=>'www用户家目录','pid'=>2),
        array('id'=>4,'city_name'=>'/home/guest','rel_id'=>'guest用户家目录','pid'=>2),
        array('id'=>5,'city_name'=>'/usr','rel_id'=>'应用程序和文件目录','pid'=>1),
        array('id'=>6,'city_name'=>'/usr/doc','rel_id'=>'Linux文档','pid'=>5),
        array('id'=>7,'city_name'=>'/usr/bin','rel_id'=>'众多应用程序','pid'=>5)
    );
    function fn_findall( $pid ){
        
        global $arr;
        $__arr = array();//array(0,...)
        foreach ( $arr as $k=>$v )
        {
            
            if( $v['pid']==$pid ){
             $__arr[] = $v;  //array(0,$v)
            }
            
        }
        return $__arr;
        
    }function fn_catelog($pid=0){
        
        $__arr = array();//array(0=>)
        $__arr = fn_findall($pid); //array(0=>array(5))
        if( !empty($__arr) ){   //empty -- 检查$__arr变量是否为空
            
            foreach ( $__arr as $k=>$v )
            {            $__arr[$k]['subclass'] = fn_catelog($v['id']);
                
            }
            
        }
        return $__arr;
    }$fn=fn_catelog(0);
    var_dump($fn);
    ?>函数fn_catelog($pid=0)内部又有调用函数fn_catelog($v['id']),已经构成了“自调用”,
    且$pid有一个期望值,不满足(!empty(__arr))条件时,则不会执行foreach循环体。
      

  2.   

    function a(){
    b();
    }
    function b(){
    a();
    }就如此简单,但是你得让他能跳出来,不然就死循环了.