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;