【问题标题】:Is this Recursive or Iteration?这是递归还是迭代?
【发布时间】:2011-05-23 01:59:35
【问题描述】:

如果你看它在底部(内部)foreach 语句中调用方法 FindChildControls,因为它来自 foreach,这是否会使其递归或迭代?

谢谢!

public static IEnumerable<T> FindChildControls<T>(this ControlCollection controlCollection) where T: class 
{
  foreach(Control control in controlCollection)
  {
    if(control is T)
    {
      yield return control as T;  
    }
    foreach(T type in control.Controls.FindChildControls<T>())  
    {  
      yield return type;  
    }  
  }   
} 

【问题讨论】:

  • public static 不是static public
  • @Saeed,两者都是有效的并且表示相同的东西,但public static 确实更常见。
  • @Saeed 我是那个编写原始代码的人,当时我正处于一种风格上,并将静态放在任何事情之前。谢天谢地,我已经恢复到正常的 blah static 模式。

标签: c# recursion iteration


【解决方案1】:

此方法是递归的,因为它在第 9 行调用自身。它还使用迭代(foreach 循环)。它也很懒,因为它会产生结果,所以除非调用者循环遍历枚举器,否则什么都不会执行。

【讨论】:

  • 实际上,我认为它们是不同的方法。它们有不同的签名。
  • @Tim,不,他们不是。这是ControlCollection 类的扩展方法,我敢打赌control.ControlsControlCollection 的5 个生啤酒。
【解决方案2】:

以下是您识别递归方法的方法。每个写得很好的递归方法都有相同的基本形状:

Method(Arguments) --> Result
    If Arguments are easy
        Return the easy result
    Else
        Make arguments for a simpler version of the problem
        Call Method one or more times with those arguments
        Combine the results and return the combined result

例如:

static int Height(Tree t)
{
    if (t == null) 
        return 0;
    else
    {
        int leftHeight = Height(t.Left);
        int rightHeight = Height(t.Right);
        return Math.Max(leftHeight, rightHeight) + 1;
    } 
}

经典的递归函数。首先,确定我们是否处于基本情况,即不能进一步减少的情况。如果我们是,那就太好了。如果不是,则找出一个或多个较小的问题,递归解决它们,然后将它们的结果组合成该问题的结果。

您的方法显然是递归的。它首先检查它是否在基本情况下。基本情况是参数没有子控件,在这种情况下,它要么返回一个包含自身的序列,要么返回一个空序列。递归情况是参数具有子控件,在这种情况下,它通过计算子控件的结果并将其与参数本身的结果相结合来返回结果。有一个基本案例和一个递归案例,可以将问题简化为自身的较小版本,因此它是一种递归方法。

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 2011-09-21
    • 2017-03-31
    • 2012-06-16
    • 2015-03-24
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多