c# - C#迭代器中的递归

标签 c# iterator

是否可以在实现 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/

相关文章:

c++ - 我无法理解 std::istream_iterator 的使用

C# 如何使应用程序在删除应用程序文件后继续运行

c# - FakeItEasy 说 MustHaveHappened 没有发生......但确实发生了

c# - 在 C# 中将 "+"键分配给 ADD 按钮

c++ - 如何在 map 的前 3 个值上使用 std::accumulate

c++ - 迭代器如何映射/知道它们的当前位置或元素

c# - 如何为特定字符匹配 N 次后的新行?

c# - 从后台线程通知 UI 线程

c++ - 迭代标准容器中的所有元素对(C++)

c++ - 如果我的容器介于两个现有值之间,那么捏造迭代器类别是否合理?