是否可以在迭代器实现中使用递归System.Collections.IEnumerable?我有一个大致像这样声明的树结构:
public class Node
{
public Node Sibling;
public Node Child;
}
Run Code Online (Sandbox Code Playgroud)
我想迭代树中的节点.我想做这样的事情(伪代码,我猜这不会编译):
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这有点可能吗?我意识到这可以通过函数中的Nodedeque 使用decurs 来解决GetEnumerator.
Joh*_*ren 20
是的,您只需要从调用站点迭代返回值.像这样:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
对于记录,这并不比使用队列实现例如广度优先遍历更好.在最坏的情况下,类似这样的内存需求是相同的.
| 归档时间: |
|
| 查看次数: |
5029 次 |
| 最近记录: |