說我非常喜歡的一個方法如下,其中調用tidy()
必須是調用recurse()
後:在遞歸調用之後存在邏輯時,從遞歸到迭代的最新方法是什麼?
void recurse(Node node)
{
foreach(Node child in node.children)
{
recurse(child);
}
tidy(node);
}
什麼是這個轉換爲迭代方法最巧妙的方法?的迭代版本
說我非常喜歡的一個方法如下,其中調用tidy()
必須是調用recurse()
後:在遞歸調用之後存在邏輯時,從遞歸到迭代的最新方法是什麼?
void recurse(Node node)
{
foreach(Node child in node.children)
{
recurse(child);
}
tidy(node);
}
什麼是這個轉換爲迭代方法最巧妙的方法?的迭代版本
僞代碼:
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
。
Stack ==遞歸。 – Sylwester
這是完美的感謝 - 不知道爲什麼我沒有看到它自己。 – RecurseYouJack
@RecurseYouJack:Sylwesters的評論其實是相當真實的。如果使用顯式堆棧而不是調用堆棧,則始終可以使用迭代算法交換遞歸算法。但是,我不知道他的意思是「等價」還是「等於」(它是第一個)。 – Zeta
只要它在每次迭代中遞歸不止一次,就不能。你可以用循環結構+顯式堆棧來替換它,但只要棧的大小增大,我會稱之爲遞歸。 – Sylwester