如果你看它在底部(内部)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;
}
}
}
答案 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;
}
}
经典的递归函数。首先,确定我们是否处于基本情况,这种情况不能进一步减少。如果我们是,那很好。如果没有,找到一个或多个较小的问题,递归地解决它们,然后将它们的结果合并到这个问题的结果中。
您的方法显然是递归的。它首先检查它是否在基本情况下。基本情况是参数没有子控件,在这种情况下,它返回一个包含自身的序列,或者返回一个空序列。递归的情况是参数具有子控件,在这种情况下,它通过计算子项的结果并将其与参数本身的结果相结合来返回结果。有一个基本案例和一个递归案例,可以将问题减少到自身的较小版本,因此它是一种递归方法。