C++ 可以用迭代器实现递归算法吗?

C++ 可以用迭代器实现递归算法吗?,c++,algorithm,computer-science,C++,Algorithm,Computer Science,我给了一棵这样的树: 我可以使用下一个操作员访问每个节点 // postorder dfs Iterator< Index<String<char> >, BottomUp<> >::Type myIterator(myIndex); for (; !atEnd(myIterator); goNext(myIterator)) // do something with myIterator //后序dfs 迭代器::键入myItera

我给了一棵这样的树:

我可以使用下一个操作员访问每个节点

// postorder dfs
Iterator< Index<String<char> >, BottomUp<> >::Type myIterator(myIndex);
for (; !atEnd(myIterator); goNext(myIterator)) 
    // do something with myIterator
//后序dfs
迭代器<索引,自底向上>::键入myIterator(myIndex);
对于(;!atEnd(myIterator);goNext(myIterator))
//用myIterator做点什么
但是我想在树上使用递归算法。
有没有办法使递归算法(排除每个节点上最大的子树)迭代?
或者如何非递归地访问元素

编辑: 实际问题:
我已经给出了一个递归算法,可以在树上运行。(递归)
我还使用一个库,其中我只能使用迭代器访问项目(非标准,迭代)

递归迭代。

如何解决这个问题?

任何递归函数都可以使用堆栈实现。如果这是你要问的问题

这里有一个关于这个问题的报告


性能的提高是一种推测性的,编译器在幕后处理我们的代码,这是无法预测的。实现这两种方法并获得一些实数。如果它们相似,请使用您认为更可读的函数。

任何递归函数都可以使用堆栈实现。如果这是你要问的问题

这里有一个关于这个问题的报告

性能的提高是一种推测性的,编译器在幕后处理我们的代码,这是无法预测的。实现这两种方法并获得一些实数。如果它们相似,则使用您认为更可读的函数。

您可以借助堆栈将该递归函数转换为迭代函数

//breadth first traversal pseudo-code
push root to a stack
while( stack isn't empty )
    pop element off stack
    push children
    perform action on current node
根据您希望遍历节点的方式,实现将有所不同。所有递归函数都可以转换为迭代函数。关于如何要求特定问题的信息的一般用法。使用堆栈/队列和转换为for循环是解决大多数情况的常用方法

您还应该研究尾部递归以及如何识别它们,因为这些问题很好地转化为for循环,许多编译器甚至为您这样做

一些更面向数学的递归调用可以通过以下方法解决。你不太可能遇到这些尚未解决的问题,但你可能会感兴趣

//编辑,性能? 这实际上取决于您的实现和树的大小。如果递归调用有很多深度,那么您将得到堆栈溢出,而迭代版本将执行良好。我会更好地掌握递归(如何使用内存),您应该能够决定哪一种更适合您的情况

您可以借助堆栈将该递归函数转换为迭代函数

//breadth first traversal pseudo-code
push root to a stack
while( stack isn't empty )
    pop element off stack
    push children
    perform action on current node
根据您希望遍历节点的方式,实现将有所不同。所有递归函数都可以转换为迭代函数。关于如何要求特定问题的信息的一般用法。使用堆栈/队列和转换为for循环是解决大多数情况的常用方法

您还应该研究尾部递归以及如何识别它们,因为这些问题很好地转化为for循环,许多编译器甚至为您这样做

一些更面向数学的递归调用可以通过以下方法解决。你不太可能遇到这些尚未解决的问题,但你可能会感兴趣

//编辑,性能?
这实际上取决于您的实现和树的大小。如果递归调用有很多深度,那么您将得到堆栈溢出,而迭代版本将执行良好。我会更好地掌握递归(如何使用内存),您应该能够决定哪一种更适合您的情况

如果您的迭代器只支持向前(可能是向后)遍历,而不支持树上的链接或快速随机访问,那么您将很难使树算法适应它。然而,最终任何答案都将取决于您的自定义迭代器提供的接口,而您并没有提供该接口


例如,考虑树搜索的简单算法。如果迭代器给出的唯一操作是“从第一个元素开始逐个移动”,那么显然无法有效地实现树搜索。也不能实现二进制搜索。因此,您必须提供一个支持哪些操作的列表,以及(关键的)每个操作的复杂性边界。

如果您的迭代器只支持向前(可能是向后)遍历,而不支持树上的链接或快速随机访问,那么您将很难适应树算法。然而,最终任何答案都将取决于您的自定义迭代器提供的接口,而您并没有提供该接口


例如,考虑树搜索的简单算法。如果迭代器给出的唯一操作是“从第一个元素开始逐个移动”,那么显然无法有效地实现树搜索。也不能实现二进制搜索。因此,您必须提供一个支持哪些操作的列表,以及(关键的)每个操作的复杂性边界。

即使使用递归迭代,您最终也会得到每个节点访问一个节点

您需要知道的是:如何让我的迭代器先进入深度,然后:如何通知我一个级别已经开始/结束(即递归步骤的开始/结束)


这些知识可以映射到递归算法上。

即使使用递归迭代,每次节点访问也会得到一个节点

您需要知道的是:如何让我的迭代器先进入深度,然后:如何通知我一个级别已经开始/结束(即递归步骤的开始/结束)

这些知识可以映射到递归算法上