C#迭代器中的递归

And*_*nck 14 c# iterator

是否可以在迭代器实现中使用递归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)

对于记录,这并不比使用队列实现例如广度优先遍历更好.在最坏的情况下,类似这样的内存需求是相同的.