2014-07-22 50 views
1

說我非常喜歡的一個方法如下,其中調用tidy()必須是調用recurse()後:在遞歸調用之後存在邏輯時,從遞歸到迭代的最新方法是什麼?

void recurse(Node node) 
{ 
    foreach(Node child in node.children) 
    { 
     recurse(child); 
    } 

    tidy(node); 
} 

什麼是這個轉換爲迭代方法最巧妙的方法?的迭代版本

+0

只要它在每次迭代中遞歸不止一次,就不能。你可以用循環結構+顯式堆棧來替換它,但只要棧的大小增大,我會稱之爲遞歸。 – Sylwester

回答

1

僞代碼:

void iterate(Node node){ 
    Vector<Node> stack; 

    stack.push(node); 

    for(unsigned int i = 0; i < stack.size(); ++i){ 
    foreach(Node child in stack[i].children){ 
     stack.push(child); 
    } 
    } 

    while(!stack.empty()){ 
    tidy(stack.top()); 
    stack.pop(); 
    } 
} 

這個版本在同一順序作爲一個遞歸調用確實tidy

+0

Stack ==遞歸。 – Sylwester

+0

這是完美的感謝 - 不知道爲什麼我沒有看到它自己。 – RecurseYouJack

+0

@RecurseYouJack:Sylwesters的評論其實是相當真實的。如果使用顯式堆棧而不是調用堆棧,則始終可以使用迭代算法交換遞歸算法。但是,我不知道他的意思是「等價」還是「等於」(它是第一個)。 – Zeta