是否可以在实现 System.Collections.IEnumerable
的迭代器中使用递归?我有一个大致如下声明的树结构:
public class Node
{
public Node Sibling;
public Node Child;
}
我想遍历树中的节点。我想做这样的事情(伪代码,我想这不会编译):
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);
}
}
}
这有可能吗?我意识到这可以在 GetEnumerator
函数中使用 Node
双端队列解决,无需递归。
最佳答案
是的,您只需要迭代调用站点的返回值即可。像这样:
IEnumerable<T> Recursive(Node node)
{
yield return node;
foreach (var siblingNode in Recursive(node.Sibling))
{
yield return siblingNode;
}
foreach (var childNode in Recursive(node.Child))
{
yield return childNode;
}
}
郑重声明,这并不比使用队列来实现例如广度优先遍历。在最坏的情况下,类似这样的内存要求是相同的。
关于c# - C#迭代器中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4202077/