<?php
 function demo($var) {
  echo $var;
  echo '<br />';
  if($var>0) {
  echo demo($var-1);
  } else {
      echo '==========';
  }
  echo '<br />';
  echo $var;
 }
 demo(10);
?>以上函数执行结果如下:
10
9
8
7
6
5
4
3
2
1
0
==========
0
1
2
3
4
5
6
7
8
9
10谁能帮我详细讲解一下函数执行过程?小弟搞不懂啊!谢谢~!

解决方案 »

  1.   

    你试试运行demo(0),demo(1),demo(2)……容易理解些吧
      

  2.   

    <?php
     function demo($var) {
      echo $var;
      echo '<br />';
      if($var>0) {
      echo demo($var-1);
      } else {
      echo '==========';
      }
      echo '<br />';
      echo $var;
     }
     demo(10);
    ?>
    我这里写一下每一步的输出吧。
    1.   10
         demo(9)
         10
    2.   10
          9
         demo(8)
          9
         10
    3.   10
          9
          8
         demo(7)
          8
          9
         10
    依次类推到最后:
    10.   10
          9
          8
          7
          6
          5
          4
          3
          2
          1
         demo(0)   (然后接着递归调用这个函数,由于已经是0,所以输出======)
          1
          2
          3
          4
          5
          6
          7
          8
          9
         10
      

  3.   

    类似队列的先进后出模式楼主你看你认为下面那个echo $var应该执行一次吧,其实不然,虽然递归一直执行的是if,但是当if条件不成立的时候他会一层层返回来的,就像时光倒流是的^   ^
      

  4.   

    首先执行demo(10);
    在此方法中输出 10 和一个换行;
    进入if判断;
    执行demo(10-1),而此时demo(10)要等到demo(9)执行完毕以后才可继续执行;
    输出9和一个换行
    依次类推直到执行到demo(1-1)即demo(0)
    输出0和一个换行
    此时0<0判断否,执行else输出=========
    然后继续输出下面的一个换行,再输出0
    此时demo(0)执行完毕,返回demo(1)继续执行
    输出 1 和一个换行;
    然后返回demo(2),执行输出2 和一个换行
    依次类推
      

  5.   

    递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。递归过程一般通过函数或子过程来实现。递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。递归算法解决问题的特点:
      (1) 递归就是在过程或函数里调用自身。
      (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
      (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
      (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。递归的原理,其实就是一个栈(stack), 比如求5的阶乘,要知道5的阶乘,就要知道4的阶乘,4又要是到3的,以此类推,所以递归式就先把5的阶乘表示入栈, 在把4的入栈,直到最后一个,之后呢在从1开始出栈, 看起来很麻烦,确实很麻烦,他的好处就是写起代码来,十分的快,而且代码简洁,其他就没什么好处了,运行效率出奇的慢.例: 求n-1的阶乘
    f(n)
    {
     if(n == 0 || n == 1)
      {
      return 1;
      }
     else
      {
      return n*f(n-1); //自己调用自己,求n-1的阶乘
      }
    }