2009-06-02 65 views
0

我正在編寫反映兩個對象圖的實用程序,並返回一個值以指示圖是否相同。這讓我想到,是否有一種普遍接受的模式來編寫遞歸算法,該算法從遞歸中的某個位置返回一個值?遞歸算法:建議的模式和實踐?

我的解決方案可能會使用ref參數和看起來像這樣的僞代碼:

public static bool IsChanged(T current, T previous) 
{ 
    bool isChanged = false;   
    CheckChanged(current, previous, ref isChanged);   
    return isChanged ; 
} 


private static void CheckChanged(T current, T previous, ref isChanged) 
{ 
    //perform recursion 
    if (graphIsChanged) 
     isChanged = true; 
    else 
     CheckChanged(current, previous, ref isChanged); 
} 

是否有更好的/清潔/更有效的方式?這種功能是否有一個通用模式?

回答

6

相比,這微不足道的高版本時,我沒有看到你的版本的任何好處:

public static bool IsChanged(T current, T previous) 
{ 
    //perform recursion 
    if (graphIsChanged) 
     return true; 
    else 
     return IsChanged(current, previous); 
} 

另外一個好處是,一些編譯器能夠使用尾調用優化的把這個版本到一個簡單的循環,這是更有效的。

+0

謝謝..我真的不能在我的情況下使用它,因爲最後的調用是有條件的取決於當前和以前的形式..但不管怎樣,一個很好的答案和示例 – flesh 2009-06-02 19:27:08

0

我一直都很喜歡從遞歸函數得到一個實際的返回值,而不僅僅是傳入一個變量的引用。我並不確定你要在你的示例中做什麼,但爲什麼不直接從CheckChanged返回一個bool呢?

0

遞歸函數沒有通用模式。唯一的要求是函數保證達到退化(即非遞歸)的情況,所以你不會以無限遞歸結束。一般來說,使用返回值可能比傳遞指針參數稍微有效一些,但這取決於具體的問題和使用的編譯器。

在任何情況下,這樣的微優化很少有幫助。專注於首先獲得最佳運行時複雜性,如果最終出現性能問題,則稍後再調整代碼。