Dojde zde k "neomezené rekurzi" ? Je tento (1,2) kod optimální? Samozřejmě strom je konečný, ale volá se yieldnode/applynode. Nejde mi o rekurzi stromu a pricipu algoritmu (což jsou) ale o kód, jestli roste stack frame s hloubkou stromu
Případně pokud ano , dokáže se s tim kompilator poprat ((tail)optimalizace, dekompozice na "goto")?
1
public IEnumerator<T> GetEnumerator()
{
foreach (var item in YieldNode(_root))
yield return item;
}
private IEnumerable<T> YieldNode(Node<T> node)
{
if (node == null)
yield break;
foreach (var item in YieldNode(node.Left))
yield return item;
yield return node.Item;
foreach (var item in YieldNode(node.Right))
yield return item;
}
2:
public void ForEach(Action<T> action)
{
ApplyToNode(_root, action);
}
private void ApplyToNode(Node<T> node, Action<T> action)
{
if (node == null)
return;
ApplyToNode(node.Left, action);
action(node.Item);