递归函数调用如何在循环中工作?

时间:2010-07-20 21:46:58

标签: loops coldfusion recursion for-loop

我有一个函数,其中有一个调用函数的循环。

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中取出(值来自“内部”递归调用循环)。

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

我有什么问题,或者这只是生活中的一个事实,我必须解决这个问题?

更新: 在更多地观察它之后,似乎最早的循环早退出。使用局部变量'x'修复了计数问题,但是如果查看上一个示例,则循环只退出4。它在条件满足之前离开。有什么想法吗?

3 个答案:

答案 0 :(得分:7)

您忘了在函数的本地 x

不要使用全局变量。 像瘟疫一样避免它们。

答案 1 :(得分: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>');
} 

答案 2 :(得分:0)

试试这个

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

   if (isChild).......................
}