这是我的递归函数:
public bool controllaSelezioneSottopagina(KPage k_oPaginaAttuale, KPage k_oPaginaSuperiore)
{
foreach (KPage k_oSottoPagina in k_oPaginaSuperiore.SottoPagine)
{
if (k_oSottoPagina.ID == k_oPaginaAttuale.ID)
{
return true;
}
else
{
if (k_oSottoPagina.SottoPagine.Count != 0)
{
controllaSelezioneSottopagina(k_oPaginaAttuale, k_oSottoPagina);
}
}
}
return false;
}
我方面,从我调用的地方来看,总是假的(函数末尾的return false
,将是最后返回的结果,EVER)。
事实上,有时它会返回true。
怎么可能?尝试调试......但我找不到错误......
答案 0 :(得分:3)
您调用该函数一次,然后循环,并返回true或自动调用。如果循环遍历所有元素并且从不满足条件(k_oSottoPagina.ID == k_oPaginaAttuale.ID),它将仅返回false。
现在假设在第一级实际满足此条件(尚未进行递归或所有递归调用返回)。
你调用该函数一次,它循环,例如在第一次测试时这个条件为真。然后你会看到一个返回值'true'
答案 1 :(得分:1)
我认为这可能只在第一次迭代中发生。我的意思是只有第一次比较可能会导致返回true。那么递归调用永远不会发生。
答案 2 :(得分:0)
你是说第一次调用函数时这个代码块永远不会出现(第一次循环)?
k_oSottoPagina.ID == k_oPaginaAttuale.ID
由于你没有返回递归调用的结果,你的函数要么吹掉堆栈,要么在某个时刻通过第一个循环返回true,要么完成循环并返回false。
答案 3 :(得分:0)
另一种替代方法是,在它进入循环的情况下不打印错误的假是
public bool controllaSelezioneSottopagina(KPage k_oPaginaAttuale, KPage k_oPaginaSuperiore)
{
foreach (KPage k_oSottoPagina in k_oPaginaSuperiore.SottoPagine)
{
if (k_oSottoPagina.ID == k_oPaginaAttuale.ID)
{
return true;
}
else
{
if (k_oSottoPagina.SottoPagine.Count != 0)
{
if(controllaSelezioneSottopagina(k_oPaginaAttuale, k_oSottoPagina))
{
return true;
}
}
}
}
return false;
}