¿Es posible utilizar la recursión en un iterador que implemente System.Collections.IEnumerable
? Tengo una estructura de árbol declarada más o menos así:Recursividad en el iterador de C#
public class Node
{
public Node Sibling;
public Node Child;
}
Me gustaría iterar sobre los nodos de un árbol. Me gustaría hacer algo como esto (pseudocódigo, supongo que esto no se compilará):
public class NodeIterator : System.Collections.IEnumerable
{
Node m_root;
public System.Collections.IEnumerator GetEnumerator()
{
recursiveYield(m_root);
}
System.Collections.IEnumeraton recursiveYield(Node node)
{
yield return node;
if (node.Child)
{
recursiveYield(node.Child);
}
if (node.Sibling)
{
recursiveYield(node.Sibling);
}
}
}
¿Es esto de alguna manera posible? Me doy cuenta de que esto se puede resolver sin recursión usando una deque Node
en la función GetEnumerator
.
debería funcionar. ¿Has probado esto? a los clientes no les debería importar cómo se implementa, solo tiene que poder iterar a través del receptor. Si la recursión simplifica su código, úselo. – Gishu
@Gishu - debería funcionar (aparte de 'IEnumeraton'), pero ignora el valor de retorno de' recursiveYield (node.Child) 'y' recursiveYield (node.Sibling) '. – Kobi
No es exactamente un duplicado, pero [rendimiento de C# del rendimiento anidado en un árbol] (http://stackoverflow.com/questions/1043050/c-performance-of-nested-yield-in-a-tree) muestra algunas soluciones y discute algunas implicaciones de rendimiento. –