我有一个函数,其中有一个循环调用函数。递归函数调用如何在循环中工作?
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时退出。它在条件满足之前离开。有任何想法吗?
我完全会,如果我知道如何!我正在学习CF ... – Jimmy 2010-07-20 22:05:22
理想情况下(如“如果您的语言支持它”),您希望尽可能将x的范围限制在for循环周围的最小区域。这是Ada正确的地方之一:for循环索引变量的范围完全是循环本身。在C++中,你可以编写“for(unsigned x = 1; ...”),并注意hasChild可能是多余的:numChildren> 0可以做同样的事情(或者是(item.hasChild &&(item.numChildren == 0))是真的有意义的条件吗?) – 2010-07-20 22:08:59
我知道范围很重要,全局变量很危险,我只是不知道语法! – Jimmy 2010-07-20 22:11:31