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

C# 这个递归函数如何返回true?,c#,function,recursion,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) {

这是我的递归函数:

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;
}
从我调用它的地方开始,我将始终得到false(函数末尾的
return false
将是将返回的最后一个结果)

事实上,有时它会返回真值


这怎么可能?已尝试调试。。。但是我找不出错误…

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


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

您是说在第一次调用函数(第一次通过循环)时,此代码块永远不会为true


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

您调用函数一次,然后它循环,要么返回true,要么递归调用自身。如果它在所有元素中循环,并且从未满足条件(k_osotopagina.ID==k_opaginattuale.ID),它将只返回false

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


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

您调用函数一次,然后它循环,要么返回true,要么递归调用自身。如果它在所有元素中循环,并且从未满足条件(k_osotopagina.ID==k_opaginattuale.ID),它将只返回false

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


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

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

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

在循环中不打印错误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;
}

在循环中不打印错误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;
}

您能否发布
KPage
类的定义,并演示如何调用
controllaSelezioneSottopagina
以导致错误的返回值?您需要
返回递归调用。可能。。对于第一个k_osotopagina,`if(k_osotopagina.ID==k_oPaginaAttuale.ID)`是真的?@Darren Young:是的,但会回到我称之为的点。不是从第一次调用开始。顺便说一句,我的0.02$-尝试用英语命名属性/类型/变量,或者至少在发布之前翻译它们,因此,我很难理解可能发生了什么。你能发布
KPage
类的定义吗,并显示如何调用
controllaselezionestopagina
以导致错误的返回值?您需要
return
递归调用。可能。。对于第一个k_osotopagina,`if(k_osotopagina.ID==k_oPaginaAttuale.ID)`是真的?@Darren Young:是的,但会回到我称之为的点。不是从开始到第一次调用。顺便说一句,我的0.02$-尝试用英语命名属性/类型/变量,或者至少在发布之前翻译它们,因此,我很难理解可能发生了什么。不完全是这样,只有在第一次调用时ID匹配时才会返回true,因为他不会返回递归调用的结果,如果他(从他的结构)进行递归调用,它将返回false。@詹姆斯·迈克尔·黑尔:用调试器再次检查。第一次呼叫与ID不匹配。因此,递归开始了。Than,我得到了正确的答案:O这就是我打开这个主题的原因…正如一些人提到的,您应该返回递归调用的结果,否则,在原始循环中上述测试匹配的任何时候都会返回正确的结果。不完全是,只有在第一次调用时ID匹配时才会返回正确的结果,因为他不返回递归调用的结果,如果他(从他的结构)进行递归调用,它将返回false。@詹姆斯·迈克尔·黑尔:用调试器再次检查。第一次呼叫与ID不匹配。因此,递归开始了。然后,我得到了答案:O这就是我打开这个主题的原因……正如一些人所提到的,您应该返回递归调用的结果,否则在原始循环中上述测试匹配的任何时候都将返回true。