2010-07-20 75 views
1

我有一个函数,其中有一个循环调用函数。递归函数调用如何在循环中工作?

function displayItem(item, isChild) 
{ 
    if (isChild) 
    { 
     writeOutput('<li>' & item.name & '</li>'); 
    } 
    else 
    { 
     writeOutput('<li>' & item.name); 
    } 
    try 
    { 
     if (item.hasChild) 
     { 
      writeOutput('<ul>'); 
      numberOfItems = item.numChildren; 
      for (x=1;x LT numberOfItems;x++) 
      { 
       displayItem(item.child[x], true); 
      } 
      writeOutput('</ul>'); 
     } 
    } 
    catch(Exception e){} 
    writeOutput('</li>'); 
} 

执行该函数后,将循环继续关闭x的从执行的值的,而不是拿起它之前离开。

例如:x是3. displayItem传递“item.child [3]”并为true。它通过函数工作,进入循环,执行到x = 4的循环,然后退出循环。该函数结束,并且(从我所理解的)返回到x应该是的点3.而不是从3开始,增加一个(使其为4),然后再次执行循环,它从4开始(值从“内部”递归调用循环)。

我知道声音不连贯,但我想不出任何其他方式来解释它。

有没有什么我做错了,或者这只是一个事实的生活,我必须解决?

UPDATE: 看过后,看起来好像最早的循环早期退出。使用'x'的局部变量可以解决计数问题,但如果查看前面的示例,则循环仅在4时退出。它在条件满足之前离开。有任何想法吗?

回答

2

的问题是这一行:

numberOfItems = item.numChildren; 

当从第二个电话回来,这个值是不是改回正确的值。所以,如果numberOfItems设置为4时,函数本身叫了起来,它已经完成并返回到功能的原始实例后,numberOfItems仍然是4

此代码的工作:

function displayItem(item, isChild) 
{ 
    var x = 1; 
    if (isChild) 
    { 
     writeOutput('<li>' & item.name & '</li>'); 
    } 
    else 
    { 
     writeOutput('<li>' & item.name); 
    } 
    try 
    { 
     if (item.hasChild) 
     { 
      writeOutput('<ul>'); 
      for (x=1;x LT item.numChildren;x++) 
      { 
       displayItem(item.child[x], true); 
      } 
      writeOutput('</ul>'); 
     } 
    } 
    catch(Exception e){} 
    writeOutput('</li>'); 
} 
7

你忘了让x本地的功能。

请勿使用全局变量。 避免他们像瘟疫。

+0

我完全会,如果我知道如何!我正在学习CF ... – Jimmy 2010-07-20 22:05:22

+0

理想情况下(如“如果您的语言支持它”),您希望尽可能将x的范围限制在for循环周围的最小区域。这是Ada正确的地方之一:for循环索引变量的范围完全是循环本身。在C++中,你可以编写“for(unsigned x = 1; ...”),并注意hasChild可能是多余的:numChildren> 0可以做同样的事情(或者是(item.hasChild &&(item.numChildren == 0))是真的有意义的条件吗?) – 2010-07-20 22:08:59

+0

我知道范围很重要,全局变量很危险,我只是不知道语法! – Jimmy 2010-07-20 22:11:31

0

试试这个

function displayItem(item, isChild) 
{ 
    var x = 0; 
    var numberOfItems = 0; 

    if (isChild)....................... 
} 
+0

深思熟虑:在cf9中,您可以使用“local”范围而不是varing。local.x = 0; – rip747 2010-07-21 12:50:06