关于递归函数的疑问

时间:2021-11-07 03:30:29
所有刚开始接触php的可能都要求写个作业,就是用递归函数创建级联目录。
我以前学asp.net的,也算有基础,所以就找了些PHP快速入门的视频看了一下。
用递归做级联目录我在网上找到一个代码是这样写的,如下:
function mkdir1($dir) 
{
    if (is_dir($dir)) 
    {
        return true;
    }
    if (is_dir(dirname($dir))) 
    {
        return mkdir($dir);
    } 
    else 
    {
        mkdir1(dirname($dir));
        return mkdir($dir);
    }
}

我对代码是这样的,虽然是网上找的,但我必须要了解每段代码的含义,而且要知道它的运行方式。
后来我觉得上面的代码有点过于,就把代码简化了。

function mkdir1($dir) 
{
    if (is_dir($dir)) 
    {
        return '所有文件夹都已存在';
    }
        mkdir1(dirname($dir));
        mkdir($dir);
}

mkdir1('a/b/c/d/e');
两段代码都可以正常执行,创建出a b c d e几个目录,路径就是a/b/c/d/e
但是我怎么也搞不懂是怎么创建出来的。
用简化过得代码说吧,我用我理解的说哈,
函数内首先判断a/b/c/d/e这个目录是否存在,如果存在返回文字提示并推出函数。
第一次运行当然不存在咯,转到mkdir1(dirname($dir));开始递归调用,这里我就不明白了,mkdir1(dirname($dir));执行后,是什么时候继续执行下面的 mkdir($dir);,并且是怎么创建出来的。
用dirname($dir)获取的第一次的目录是a/b/c/d
然后依次是
a/b/c
a/b
a
不管是哪个,这个时候a目录反正是不存在的,那么第一次获取到a/b/c/d的时候,mkdir($dir);应该提示不存在该目录啊,到底是什么时候开始创建的a目录啊。
请大师帮我理一下执行顺序啊。

5 个解决方案

#1


mkdir1(dirname($dir));执行后
就继续执行下面的 mkdir($dir);

#2


引用 1 楼 xuzuning 的回复:
mkdir1(dirname($dir));执行后


Quote: 引用 1 楼 xuzuning 的回复:

mkdir1(dirname($dir));执行后
就继续执行下面的 mkdir($dir);


mkdir1(dirname($dir));执行后,这个执行几次,是把/a/b/c/d/e都执行完之后还是执行一次就执行下面的mkdir($dir);了?
我echo出来的$dir依次是
a/b/c/d
a/b/c
a/b
a
如果mkdir('a/b/c/d');应该提示没有该目录啊,而且也没有父级目录,按理应该报错啊。

#3


        mkdir1(dirname($dir));
echo $dir; //看一下就知道!冥想是没用的
        mkdir($dir);

#4


引用 3 楼 xuzuning 的回复:
        mkdir1(dirname($dir));
echo $dir; //看一下就知道!冥想是没用的
        mkdir($dir);


我就是echo了的啊,我上面写了的,版主大大。
我echo出来的$dir依次是
a/b/c/d
a/b/c
a/b
a
如果mkdir('a/b/c/d');应该提示没有该目录啊,而且也没有父级目录,按理应该报错啊。

#5


根据你的代码:
第一次执行mkdir1的时候对应的目录是a/b/c/d;判断这个是不是路径,是路径继续执行下一个mkdir1();下面的mkdir是挂起的并没有执行。
第二次执行mkdir1的时候对应的目录是a/b/c;判断是不是路径,是路径继续执行下一个mkdir1();下面的mkdir同样是挂起的并没有执行。
第三次执行mkdir1的时候对应的目录是a/b;判断是不是路径,是路径继续执行下一个mkdir1();下面的mkdir同样是挂起的没有执行。
第四次执行mkdir1的时候对应的目录是a;判断是不是路径,是路径继续执行下一个mkdir1();下面的mkdir同样还没有执行。
第五次执行mkdir1的时候对应的目录应该是null了,这个时候不是路径会return返回。不会再执行mkdir1也不会执行mkdir创建目录。返回执行到第四次的mkdir创建目录,不管你的目录创建成功还是失败都会结束当前的执行然后返回第三次然后继续这一步同样的操作。(至于你说的为什么不报错,因为mkdir只创建目录,返回的结果创建成功是true失败是false)

#1


mkdir1(dirname($dir));执行后
就继续执行下面的 mkdir($dir);

#2


引用 1 楼 xuzuning 的回复:
mkdir1(dirname($dir));执行后


Quote: 引用 1 楼 xuzuning 的回复:

mkdir1(dirname($dir));执行后
就继续执行下面的 mkdir($dir);


mkdir1(dirname($dir));执行后,这个执行几次,是把/a/b/c/d/e都执行完之后还是执行一次就执行下面的mkdir($dir);了?
我echo出来的$dir依次是
a/b/c/d
a/b/c
a/b
a
如果mkdir('a/b/c/d');应该提示没有该目录啊,而且也没有父级目录,按理应该报错啊。

#3


        mkdir1(dirname($dir));
echo $dir; //看一下就知道!冥想是没用的
        mkdir($dir);

#4


引用 3 楼 xuzuning 的回复:
        mkdir1(dirname($dir));
echo $dir; //看一下就知道!冥想是没用的
        mkdir($dir);


我就是echo了的啊,我上面写了的,版主大大。
我echo出来的$dir依次是
a/b/c/d
a/b/c
a/b
a
如果mkdir('a/b/c/d');应该提示没有该目录啊,而且也没有父级目录,按理应该报错啊。

#5


根据你的代码:
第一次执行mkdir1的时候对应的目录是a/b/c/d;判断这个是不是路径,是路径继续执行下一个mkdir1();下面的mkdir是挂起的并没有执行。
第二次执行mkdir1的时候对应的目录是a/b/c;判断是不是路径,是路径继续执行下一个mkdir1();下面的mkdir同样是挂起的并没有执行。
第三次执行mkdir1的时候对应的目录是a/b;判断是不是路径,是路径继续执行下一个mkdir1();下面的mkdir同样是挂起的没有执行。
第四次执行mkdir1的时候对应的目录是a;判断是不是路径,是路径继续执行下一个mkdir1();下面的mkdir同样还没有执行。
第五次执行mkdir1的时候对应的目录应该是null了,这个时候不是路径会return返回。不会再执行mkdir1也不会执行mkdir创建目录。返回执行到第四次的mkdir创建目录,不管你的目录创建成功还是失败都会结束当前的执行然后返回第三次然后继续这一步同样的操作。(至于你说的为什么不报错,因为mkdir只创建目录,返回的结果创建成功是true失败是false)