【问题标题】:How can this recursive function return true?这个递归函数如何返回true?
【发布时间】:2012-04-24 05:03:34
【问题描述】:

这是我的递归函数:

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。

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

【问题讨论】:

  • 您能否发布KPage 类的定义,并说明您如何调用controllaSelezioneSottopagina 来导致错误的返回值?
  • 你需要return递归调用。
  • 也许.. 对于第一个 k_oSottoPagina `if (k_oSottoPagina.ID == k_oPaginaAttuale.ID)` 为真?
  • @Darren Young :是的,但会回到我所说的那个地方。不是从第一次通话开始。
  • 顺便说一句,我的 0.02$ - 尝试用英文命名属性/类型/变量,或者至少在发布到 SO 之前翻译它们,我很难理解可能发生的事情。跨度>

标签: c# function recursion


【解决方案1】:

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

k_oSottoPagina.ID == k_oPaginaAttuale.ID

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

【讨论】:

  • 不完全是,只有在第一次调用时 ID 匹配时才会返回 true,因为如果他曾经进行递归调用(来自他的结构),他不会返回递归调用的结果它会返回 false。
  • @James Michael Hare :用调试器再次检查。第一次调用与 ID 不匹配。于是,递归开始。比,我明白了:O这就是我打开这个话题的原因......
  • 正如一些人提到的,你应该返回递归调用的结果,否则任何时候上面的测试在原始循环中匹配都会返回true。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在它进入循环的情况下不打印不正确的 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-24
        • 2019-02-20
        • 1970-01-01
        • 2018-08-02
        • 2021-07-25
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        相关资源
        最近更新 更多