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

Loops 递归函数调用如何在循环中工作?,loops,coldfusion,recursion,for-loop,Loops,Coldfusion,Recursion,For Loop,我有一个函数,其中有一个循环调用这个函数 function displayItem(item, isChild) { if (isChild) { writeOutput('<li>' & item.name & '</li>'); } else { writeOutput('<li>' & item.name); } try {

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

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>');
} 
函数显示项(项,子项)
{
if(isChild)
{
writeOutput(“
  • ”&item.name&“
  • ”); } 其他的 { writeOutput(“
  • ”&item.name); } 尝试 { if(项目hasChild) { 写输出(“
      ”); numberOfItems=item.numChildren; 对于(x=1;x LT numberOfItems;x++) { displayItem(item.child[x],true); } 写输出(“
    ”); } } 捕获(例外e){} 写输出(“
  • ”); }
    函数执行后,循环将继续执行该执行中的x值,而不是从之前停止的地方开始

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

    我知道这听起来语无伦次,但我想不出任何其他方式来解释它

    是我做错了什么,还是这只是生活中的一个事实,是我必须解决的问题

    更新:
    在进一步研究之后,似乎最早的循环正在提前退出。为“x”使用局部变量修复了计数问题,但是如果查看前面的示例,循环仅在4处退出。它在条件满足之前离开。有什么想法吗?

    您忘记将x设置为函数的局部

    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设置为函数的局部

    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>');
    } 
    
    不要使用全局变量。 像躲避瘟疫一样躲避它们。

    试试这个

    function displayItem(item, isChild)
    {
       var x = 0;
       var numberOfItems = 0;
    
       if (isChild).......................
    } 
    
    试试这个

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

    问题在于这一行:

    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>');
    } 
    
    函数显示项(项,子项)
    {
    var x=1;
    if(isChild)
    {
    writeOutput(“
  • ”&item.name&“
  • ”); } 其他的 { writeOutput(“
  • ”&item.name); } 尝试 { if(项目hasChild) { 写输出(“
      ”); 对于(x=1;x LT item.numChildren;x++) { displayItem(item.child[x],true); } 写输出(“
    ”); } } 捕获(例外e){} 写输出(“
  • ”); }
    问题在于这一行:

    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>');
    } 
    
    函数显示项(项,子项)
    {
    var x=1;
    if(isChild)
    {
    writeOutput(“
  • ”&item.name&“
  • ”); } 其他的 { writeOutput(“
  • ”&item.name); } 尝试 { if(项目hasChild) { 写输出(“
      ”); 对于(x=1;x LT item.numChildren;x++) { displayItem(item.child[x],true); } 写输出(“
    ”); } } 捕获(例外e){} 写输出(“
  • ”); }
    理想情况下(如“如果您的语言支持的话”),您希望尽可能将x的范围限制在for循环周围的最小区域。这是Ada做对的地方之一:for循环索引变量的作用域正是循环本身。在C++中,您将写“(无符号x=1;…)”。也注意HasCHIAL可能是多余的:NoMeStudio > 0可以做同样的事情。(或者是(Ith.Hasfand &(In.NoPHOSS==0))是真的有意义的条件吗?)我知道范围是重要的,全局变量是危险的。我不知道语法!如果你使用CF9,添加“var”。在x=1前面。如果您使用的是CF8或更早版本,请在函数的第一行添加“var x=0”。不幸的是,这并没有改变函数的行为。:(我仍然得到相同的结果。好的一面是,我不再使用全局变量了!理想情况下(如“如果您的语言支持它”)您希望尽可能地将X的范围限制到for循环的最小区域。这是艾达正确的地方之一:for循环索引变量的范围正好是循环本身。在C++中,您将编写“for(un签署x=1;…)”。另外请注意,hasChild可能是多余的:numChildren>0也可以做同样的事情。(或者(item.hasChild&&(item.numChildren==0))为真是一个有意义的条件吗?)我知道作用域很重要,全局变量很危险。我只是不知道语法!如果使用CF9,请添加“var”在x=1前面。如果您使用的是CF8或更早版本,请在函数的第一行添加“var x=0”。不幸的是,这并没有改变函数的行为。:(我仍然得到相同的结果。好的一面是,我不再使用全局变量了!值得思考的是:在cf9中,您可以使用“local”scope代替varing.local.x=0;值得思考的是:在cf9中,您可以使用“local”作用域代替varing.local.x=0;