并且执行Floop($i+1);的时候,后面的这个语句就不应该执行了呀。它怎么能执行到后面去呢?

解决方案 »

  1.   

    是指return 后吗?既然已经return的话,应该就退出当前程序了呀。
    并且,如果重新执行也不应该拣Floop($i+1);后面的开始执行啊。它的执行原理是什么呢?
      

  2.   

    函数改为
    function Floop($i=0){
    print "<p>i:" . $i . "</p>\n";
    if ($i<3){
    return Floop($i+1);
    }
    print "<p>i:" . $i . "</p>\n";
    return $i;
    }
      

  3.   

    谢谢。
    能帮忙解释一下:
    return Floop($i+1);
    中return的作用与原理吗?在这个程序片段中程序执行的流程应该是怎样的?为什么执行Floop($i+1);后还会逐层在执行Floop($i+1);后的语句。这个后面的语句包括最后的return $i;吗?
      

  4.   

    你的原函数的执行结果i:0i:1i:2i:3i:3i:2i:1i:0呈前后对比出现。(我把其中的test去掉,和最后一个去掉,使使之看得更明确)。
      

  5.   

    把递归看作树,则
    function Floop($i=0){
    print "<p>i:" . $i . "</p>\n";
    if ($i<3){
    return Floop($i+1);
    }
    print "<p>i:" . $i . "</p>\n";
    return $i;
    }
    为中序遍历。
    输出节点值,然后进入子节点。直至到叶节点($i=3)。
    携带叶节点值返回上级,直至根节点。
    若Floop($i+1);前没有return,那么当然要执行到return $i;并且返回的值也不是叶节点的
      

  6.   

    //Floop(0)
    print "<p>i: 0 </p>\n";
    //Floop(1);
    print "<p>i: 1 </p>\n";
    //Floop(2);
    print "<p>i: 2 </p>\n";
    //Floop(3);
    print "<p>i: 3 </p>\n";
    print "<p>i: 3 </p>\n";
    print "<p>test</p>\n"; //return 3; 后执行
    print "<p>i: 2 </p>\n";
    print "<p>test</p>\n"; //return 2; 后执行
    print "<p>i: 1 </p>\n";
    print "<p>test</p>\n"; //return 1; 后执行
    print "<p>i: 0 </p>\n";
    return 0;
      

  7.   

    按照流程,每次执行到Floop($i+1); 的时候,应该就不往下执行,如果符合条件,那么又开始执行Floop($i+1); ,如果不符合条件,则不再执行,为什么会再执行后面的print呢?并且是所有层次递归执行完毕之后。
      

  8.   

    是吗?
    执行到Floop($i+1); 表示调用函数Floop,那么Floop结束做什么呢?函数执行完后,不是返回到调用函数处的下一行吗?
      

  9.   

    我可能一时没能想到。我还是不能把思路理顺。并且是,为什么是在三次调用执行完毕,再执行Floop后的语句。
      

  10.   

    楼上blueaurora(蓝色极光) 的回复你能理解吗?你的函数执行流程就是那样的
      

  11.   

    把你的程序改一下,这样会不会好理解一些function Floop0($i=0){
    print "<p>i:" . $i . "</p>\n";
    if ($i<3){
    Floop1(1);
    print "<p>test</p>\n";
    }
    print "<p>i:" . $i . "</p>\n";
    return $i;
    }
    function Floop1($i=1){
    print "<p>i:" . $i . "</p>\n";
    if ($i<3){
    Floop2(2);
    print "<p>test</p>\n";
    }
    print "<p>i:" . $i . "</p>\n";
    return $i;
    }
    function Floop2($i=2){
    print "<p>i:" . $i . "</p>\n";
    if ($i<3){
    Floop3(3);
    print "<p>test</p>\n";
    }
    print "<p>i:" . $i . "</p>\n";
    return $i;
    }
    function Floop3($i=3){
    print "<p>i:" . $i . "</p>\n";
    if ($i<3){
    Floop4(4);
    print "<p>test</p>\n";
    }
    print "<p>i:" . $i . "</p>\n";
    return $i;
    }
    $r_Floop = Floop0();
    print "<p>r_Floop:" . $r_Floop . "</p>\n";
      

  12.   

    递归是这样的: i=0-->
                       i=1-->
                              i=2--->
                                    i=3 不满足条件回归,执行下面的代码
                              i=2<---
                                     
                       i=1<---
                 i=0<----
      

  13.   

    呵呵,以前看见一个帖子,那哥们管递归叫“自己拔自己的头发过河”。实际上递归调用也就那么回事,就是函数自己调用函数自己(你的Floop函数中,“调用”Floop函数),递归有两部分组成:递归调用部分,和结束语句不分(当你的i=3),递归调用的形式比较简单,和递归定义差不多少,只不过是执行过程复杂。当你的值不是结束语句的条件的时候,调用那个递归语句(因为PHP是顺序执行的所以每次调用前有一个打印当前参数的过程)至于return Floop($i+1);
    那么一定是你的主函数中有一个需要调用Floop($i);的过程,当不为3的时候(它给初值i=0),执行一个后返回一个Floop(参数);这个还要拿回来执行直到参数》=3,才结束调用,执行主函数中需要调用Floop()函数下面的部分。