1
我有一棵芒果項目,並且對於每個項目我想應用一種處理將它們變成蘋果,我該如何編寫一個方法(在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);
}
在大多數情況下,您可以用循環和某種堆棧來替換遞歸調用,例如,看看[這裏](https://blogs.msdn.microsoft.com/ericlippert/2005/08/01/recursion-part-two-unrolling-a-recursive-function-with-an-explicit-stack/) 。畢竟,遞歸方法調用也是這樣做的:他們只是在調用堆棧上再次調用同一個方法,並附帶一些參數信息等。 – Thomas
我不確定遞歸是什麼意思。您可以使用堆分配的數據結構來處理遞歸而不是系統堆棧,從而將遞歸過程編寫爲迭代循環。如果沒有任何種類的遞歸過程,你就無法做到這一點,因爲這需要樹的每個節點都不會有多於一個孩子,因此也就是一個鏈表。 – Sylwester
如果你使用'Tree'結構,恐怕你不得不使用遞歸,隱藏或顯式。例如,如果你使用'TreeSet',你可能會得到它的迭代器,並用'while'循環遍歷所有的元素。但是在迭代器中,會有多次對'TreeMap.successor(條目 t)'方法的遞歸調用 –