2010-01-22 69 views
0

我只是想知道,是否有可能這個遞歸函數轉換成非遞歸函數轉換一個遞歸函數非遞歸

unsigned Parser::Not(unsigned eff) 
{ 
    if (eff == 0) return 1; 

    if (eff == 1) return 0; 

    Node rn(ri.get_key(eff)); 

    rn.t_branch_id = Not(rn.t_branch_id); 
    rn.f_branch_id = Not(rn.f_branch_id); 

    return CodeRuleNode(rn); 
} 

回答

8

是。您可以通過實現自己的堆棧來跟蹤狀態,將任何遞歸函數轉換爲非遞歸函數。

0

任何遞歸函數都可以非遞歸地編寫。但是,您需要使用堆棧或其他數據結構來跟蹤您訪問過的節點。

1

這是可能的,是的。但是,在Node類中沒有父引用的情況下,這將很困難,並且需要一個當前節點的向量(模擬堆棧)。如果您可以更改Node類以包含對父級的引用,則這會使迭代更容易,因爲仿真堆棧隱式地存在於樹定義中。

但是,像這樣生成深度優先的樹是遞歸的完美工作,因爲讀取和寫入更爲直觀,因此不易出現錯誤。

0

是的,我認爲這是可能的。任何遞歸函數都可以轉換爲非遞歸函數。

但是,如果RETURN命令是遞歸函數中的最後一個命令,則必須使用堆棧並且.otherwise從堆棧中使用是沒有必要的。

祝你好運!