这是递归还是迭代?

时间:2010-12-09 19:32:07

标签: c# recursion iteration

如果你看它在底部(内部)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;  
    }  
  }   
} 

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:8)

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

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

经典的递归函数。首先,确定我们是否处于基本情况,这种情况不能进一步减少。如果我们是,那很好。如果没有,找到一个或多个较小的问题,递归地解决它们,然后将它们的结果合并到这个问题的结果中。

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