【发布时间】:2017-05-28 21:28:16
【问题描述】:
我有一棵芒果树,对于每个我想应用处理将它们变成苹果的项目,我如何编写一个方法(在 Java 中会很好),它占据芒果树元素的顶部和不递归返回苹果树的顶部。
通过递归,我有这样的东西:
Apple transform(Mangoe ma){
//Construct an apple from some modified mangoes properties
Apple ap = new Apple(...);
List<Apple> apChildren = new ArrayList<Apple>();
for(Mangoe maChild:ma.getChildren())
children.add(transform(maChild));
ap.setChildren(children);
return ap;
}
如何使用不递归的方法重复此行为??
编辑: 我正在考虑这个算法来解决这个问题:
List<Mangoe> itemsToTreat = new ArrayList<Mangoe>();
itemsToTreat.add(ma);
while(itemsToTreat!=null){
//Apply treatment
//it's impossible to set the child of a created apple without recursion
//get the direct children of itemsToTreat
itemsToTreat = getDirectChildrenOfItemsToTreat(itemsToTreat);
}
【问题讨论】:
-
在大多数情况下,您可以将递归调用替换为循环和某种堆栈,例如看看here。毕竟,递归方法调用也是如此:它们只是将同一方法的另一个调用连同参数等一些信息放在调用堆栈中。
-
我不确定你所说的递归是什么意思。您可以借助堆分配的数据结构将递归过程编写为迭代循环,以处理递归而不是系统堆栈。如果没有任何类型的递归过程,你就无法做到这一点,因为这将要求树的每个节点都不能有多个子节点,因此需要一个链表。
-
如果您使用
Tree结构,恐怕您将不得不使用递归,无论是隐藏的还是显式的。例如,如果您使用TreeSet,您可能会得到它的迭代器并使用while循环遍历所有元素。然而在迭代器内部会有多次递归调用TreeMap.successor(Entry<K,V> t)方法