第一个函数一直等待最后递归的函数结束返回值之后才能结束。因此递归的时候会有多个相同的函数被调用,且占用各自资源 ,最后同时运行一个个结束; 所以递归层数太深不宜使用, ; 注意要有结束条件
注意 递归中每个函数值是独立的 ; 如果某些值需要叠加,考虑静态变量或者能接受
例子 :递归计算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()把数组的单元顺序相反的数组