1

这是我的递归函数:

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函数末尾的,将是最后一个返回的结果,永远)。

事实上,有时它会返回 true。

怎么可能?尝试调试...但我无法找出错误...

4

4 回答 4

3

您调用该函数一次,然后它循环,并返回 true 或递归调用自身。只有在遍历所有元素并且条件 (k_oSottoPagina.ID == k_oPaginaAttuale.ID) 从未满足时,它才会返回 false。

现在假设在第一级实际上满足了这个条件(还没有进行递归或所有递归调用都返回)。

您调用该函数一次,它会循环,例如在第一次测试中,此条件为真。然后你会看到一个返回值'true'

于 2012-04-11T20:45:43.723 回答
1

我认为这只能在第一次迭代中发生。我的意思是只有第一次比较可能会导致返回 true。递归调用永远不会发生。

于 2012-04-11T20:50:48.100 回答
0

在它确实进入循环的情况下不打印不正确 false 的另一种方法是

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;
}
于 2014-08-20T05:28:07.600 回答
0

你是说这个代码块在第一次调用函数时(第一次通过循环)永远不会是真的?

k_oSottoPagina.ID == k_oPaginaAttuale.ID

由于您不返回递归调用的结果,因此您的函数要么破坏堆栈,在某个点通过第一个循环返回 true,要么完成循环并返回 false。

于 2012-04-11T20:45:15.477 回答