这个递归函数如何返回true?

时间:2012-04-11 20:41:03

标签: c# function recursion

这是我的递归函数:

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。

怎么可能?尝试调试......但我找不到错误......

4 个答案:

答案 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;
}