2014-05-08 38 views
0

我对这段代码有些困惑。当我进行递归调用时,每次调用时都会执行document.writeln()行吗?或者document.writeln()何时执行?无法理解JavaScript递归调用输出

<SCRIPT LANGUAGE = "JavaScript"> 
    var a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 

    someFunction(a, 0); 

    function someFunction(b, x) 
    { 
    if (x < b.length) { 
    someFunction(b, x + 1); //recursive call 
    document.writeln(b[ x ] + " "); 
    } 
    } 
</SCRIPT> 

谢谢。

+0

什么是这里的递归函数的原因是什么?为什么不使用简单的'for()'循环? – h2ooooooo

+0

这将以相反的顺序打印项目。如果你用'someFunction'和'document.write'交换行,它将按顺序打印这些项目。 – Halcyon

+0

我只是想了解递归。我知道它可以通过使用带反向计数器的for循环完成,但无法理解递归。 – Zoubeir

回答

0

请注意,您将x+1传递给可接受的电话。最终,这将导致x等于b.length,函数将返回。所有的嵌套写操作都会执行(首先是更大的x)。

这里是扩展版本:

function someFunction(b, x) { 
    if (x < b.length) { 
     if (x+1 < b.length) { 
      if (x+2 < b.length) { 
       if (x+3 < b.length) { 
        ... // Eventually the condition will be false. 
       } 
       document.writeln(b[x+2] + " "); 
      } 
      document.writeln(b[x+1] + " "); 
     } 
     document.writeln(b[x] + " "); 
    } 
} 
+0

这也有很大帮助! – Zoubeir

4

可视化的递归调用树的步骤可能会有所帮助:

1. foo1() 
2.  foo2() 
3.   foo3() 
4.   document.write() 
5.  document.write() 
6. document.write() 

以这个例子,尝试可视化树将是什么样子,如果document.write电话是递归调用之前。

+1

实际上在那里还有一个'foo'调用_doesn't_不做'document.write'。 – Halcyon

+0

你是对的!我并不是说把它写出来用于确切的代码 - 只是为了展示如何可视化递归调用树。虽然好点! –

0

每次调用函数时都会执行document.writeln()(直到条件成立,否则函数内部的语句返回true)。因此,该功能的输出为 “10 9 8 7 6 5 4 3 2 1”

+0

好了,现在我明白了!欢呼 – Zoubeir