递归函数

第一个函数一直等待最后递归的函数结束返回值之后才能结束。因此递归的时候会有多个相同的函数被调用,且占用各自资源 ,最后同时运行一个个结束; 所以递归层数太深不宜使用, ; 注意要有结束条件

注意 递归中每个函数值是独立的 ; 如果某些值需要叠加,考虑静态变量或者能接受

 

例子 :递归计算5前面的和

例子 :递归借钱

张三问李四借钱,李四没有说我去找人借,函数1等待;李四去问王五借,函数2等待;王五借钱给李四结束函数3;李四借钱给张三结束函数2;最后张三借到钱了函数1结束

例子 :文件夹递归

每次递归碰到文件夹就进去,直到把所有文件夹文件都找出来,本层递归结束,返回。故z.txt最后得出。所以顺序如图,深度优先?

 

递归实战之级联目录创建与删除

<?php 
    function delect_dir($path){
        //判断当前路径是否为目录
        if (!is_dir($path)){
            return false;
        }

        //打开目录,记住操作目录都要打开
        $od = opendir($path);
        //获得目录每个文件
        while ( ($file = readdir($od)) != false ){
            if ($file == '.' || $file == '..'){
                continue;
            }
            //每次判断是否为文件则删除,否则目录继续打开做一样操作
            if (!is_dir($path . '/' . $file)){
                unlink($path . '/' . $file);
            } else {
                delect_dir($path . '/' .$file);
            }
        }
        closedir($od);    //
        rmdir($path);      //删除里面东西再删除目录
        return true;
    }
        echo delect_dir('./ab') ? 'success' : 'del_fali or dir_no';
 ?>

注意使用 实例 来分析编码思路 ,当第二次以上操作 和 上一次重复 且都是和本方法 操作一样 时 使用递归

比如 递归删除文件夹(目录) : 首先判断当前路径是否为文件夹,是,打开文件夹,while循环获取文件夹所有东西,并每次循环判断是否为非目录 是则删除 , 不是则打开该目录 则开始做 一样的操作 还是本方法有的!则递归!

因为rmdir,故删除完文件夹里面所有东西后,再删除该文件夹

注意递归处一样传参可能不同

 

实战之递归打印树形目录

<?php 
    function create_dir($path){    
        //若该目录存在则直接返回true
        if (is_dir($path)){
            return true;
        }

        //若该目录不存在,但父存在,创建该目录
        if (is_dir(dirname($path) ) ){
            return mkdir($path);    //bool
        }

        
        create_dir(dirname($path));//若父目录也不存在,则递归创建父目录
        return mkdir($path); //创建父目录后再创建子目录
    }

    echo create_dir('./a/b/c') ? '成功' : '失败'; 
    
 ?>

递归解决多维数组转义字符问题

<?php 
    $arrr = array('a"',array("b'",'c'));

    //转义字符函数
    function addslashes_test($arr){
        foreach($arr as $v =>$k)
        {
            if (is_string($v)){
                $arr[$k] = addslashes($v);
            } else if (is_array($v)){
                //递归把第N维的转义并放入1维中
                $arr[$k] = addslashes_test($v);
            }
        }
        return $arr;
    }
    //$arrr = addslashes_test($arrr);
    print_r(addslashes_test($arrr));
 ?>

array_reverse()把数组的单元顺序相反的数组

原文地址:https://www.cnblogs.com/lzhlearn/p/5804922.html