コレクションを検索し、条件を再帰的に評価する以下のようなメソッドがあります。
public static bool Recurse(this INodeViewModel node, Func<INodeViewModel,bool> predicate)
{
INodeViewModel currentNode = node;
return predicate(currentNode) || node.Children.Select(x => Recurse(x, predicate)).Any(found => found);
}
別の方法として、スタックを使用して再帰を回避することもできます。
public static bool UsingStack(this INodeViewModel node, Func<INodeViewModel, bool> predicate)
{
var stack = new Stack<INodeViewModel>();
stack.Push(node);
while(stack.Any())
{
var current = stack.Pop();
if (predicate(current))
return true;
foreach (var child in current.Children)
{
stack.Push(child);
}
}
return false;
}
私の質問は、ツリーの深さが再帰バージョンと比較して大きい場合、スタック バージョンはパフォーマンス上の利点を提供しますか?