【发布时间】:2015-11-17 21:44:12
【问题描述】:
考虑以下代码在玫瑰树上实现深度优先搜索:
public class RoseTree<T>
{
public T Value;
public IEnumerable<Lazy<RoseTree<T>> Children;
public IEnumerable<T> Flatten()
{
yield return Value;
foreach (var childValue in Children.SelectMany(t => t.Value.Flatten()))
yield return childValue;
}
}
我一直在努力想出一个等价的非递归等价物。特别是,虽然很容易得到一个严格的非递归、准等价的函数,例如:
public IEnumerable<T> FlattenIteratively()
{
var roseTreeQueue = new Stack<RoseTree<T>>();
var values = new Queue<T>();
roseTreeQueue.Push(this);
while (roseTreeQueue.Any())
{
var top = roseTreeQueue.Pop();
values.Enqueue(top.Value);
foreach (var child in top.Children.Reverse())
roseTreeQueue.Push(child.Value);
}
return values;
}
虽然对于具有定义值的有限树,这会产生与 Flatten 相同的结果,但对于无限树或具有未定义值的树,它会失败。有没有人看到编写一种非递归方法来遍历这个结构的方法,它具有与递归方法相同的特征。
注意:鉴于 C# 重写了 yield return 函数,调用第一个方法 recursive 有点误导。如果有人有更准确的术语,我很乐意提供。
【问题讨论】: