function A (num){
  if(num>0){
    A(num-1);
    document.writeln(num);//echo 1-2-3
  }
}A(3);
一个简单的递归 看着有点迷糊。
疑问1.最后的1,2,3 是通过什么过程输出?
    2.当函数执行到A(num-1)的时候 都要进行自调用(不停的调用) 如何能运行到document.writeln()?
    3.菜鸟发问 误怒~
    高手指教!~

解决方案 »

  1.   

    递归是个将函数中断,并把现场压入栈结构(后进先出)的过程,
    因为是num-1,最终总会执行到  num=0, 
    此时就退栈, 并执行上一次没执行完成的函数,document.write
    最终退回到第一次调用A()
      

  2.   

    最后一步执行 A(0),且递归结束;
    回到 A(1) 的调用点继续执行,输出 1,执行完毕;
    回到 A(2) 的调用点继续执行,输出 2,执行完毕;
    回到 A(3) 的调用点继续执行,输出 3,执行完毕。
      

  3.   

    有一道题目:有10个小孩排成一行,问第10个小孩的时候,他说他比第9个小孩大2岁,问第9个小孩时,他又说比第8个小孩大两岁,当问到第一个小朋友的时候,他说他只有5岁,现在要算出第10个小朋友是多少岁。这就是一个简单的递归调用。 function findAge(n){
    if (n==1)
    {
    return 5;//问第一个人只有5岁。
    }else{
    return findAge(n-1)+2;
                      //第n-1个人的年龄+2岁正好等于第n个人的年龄,就是一个反推算原理。
    }
    }
    alert(findAge(10))//得出了第10个人的年龄。
      

  4.   


    function A (num){
      if(num>0){
      A(num-1);
      document.writeln(num);//echo 1-2-3
      }
    }A(3);等同如下瀑布流:var num=3;
    if(num>0){
      {
      var num1=num-1;
      if(num1>0){
        var num2=num1-1;
        if(num2>0)
         var num3=num2-1;
        if(num3>0){
        此时num3=0;这个分支不再执行;
        }
        document.writeln(num2);//  }
     document.writeln(num1);//
    }
      document.writeln(num);//
      }