E 'possibile utilizzare la ricorsione in un iteratore attuazione System.Collections.IEnumerable
? Ho una struttura ad albero dichiarata all'incirca in questo modo:ricorsione in C# iteratore
public class Node
{
public Node Sibling;
public Node Child;
}
Vorrei eseguire un'iterazione sui nodi di un albero. Mi piacerebbe fare qualcosa di simile (pseudocodice, credo che questo non verrà compilato):
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);
}
}
}
È questo in qualche modo possibile? Mi rendo conto che questo può essere risolto senza ricorsione utilizzando una deque Node
nella funzione GetEnumerator
.
dovrebbe funzionare. Hai provato questo? i clienti non dovrebbero preoccuparsi di come è implementato - deve solo essere in grado di scorrere il ricevitore. Se la ricorsione rende il tuo codice più semplice, usalo. – Gishu
@Gishu - dovrebbe funzionare (a parte 'IEnumeraton'), ma si ignora il valore di ritorno del' recursiveYield (node.Child) 'e' recursiveYield (node.Sibling) '. – Kobi
Non esattamente un duplicato, ma [C# prestazioni del rendimento annidato in un albero] (http://stackoverflow.com/questions/1043050/c-performance-of-nested-yield-in-a-tree) mostra alcune soluzioni e discute alcune implicazioni sulle prestazioni. –