2015-09-23 73 views
0
bool isContainedSameForm(AG ag1, AG ag2){ 
    if(isEmpty(ag2)) return false; 
    return isContainedSameForm(ag1->pH,ag2->pH) && isContainedSameForm(ag1->sH,ag2->sH); 
}; 
int sameFormOcurrences(AG ag1,AG ag2,bool (*isContainedSameForm)(AG,AG)){ 
    if(isEmpty(ag2)) return 0; 
    int ret=0; 
    if(isContainedSameForm(ag1,ag2)) ret=1; 
    return ret + sameFormOcurrences(ag1,ag2->pH,isContainedSameForm) + sameFormOcurrences(ag1,ag2->sH,isContainedSameForm); 
}; 

int sameFormOcurrences(AG ag1, AG ag2){ 
    return sameFormOcurrences(ag1,ag2,isContainedSameForm); 
} 

AG是一個普通的樹,這計數相同形式的樹有多少次出現在第二樹C/C++函數的參數

enter image description here

我不明白的是第一個目的sameFormOcurrences函數接收isContainedSameForm參數。

僅僅是改變簽名而不改變它的名字的一種方法? 如果它試圖避免未定義的方法,那麼它是否與上面已經聲明的函數重複?

+0

是的,在這種情況下它有什麼用途? –

+2

這是一個謂詞。這意味着您可以傳遞不同的算法來檢查它是否包含在同一個表單中,而不會更改sameFormOcurrences。 –

+6

它可以讓你使用你自己的函數,而不是硬編碼到'isContainedSameForm'中,就像使用普通的函數調用一樣。參數具有相同名稱的事實是無關緊要的。 –

回答

2

此代碼不是以最佳風格,函數指針參數和實現該函數的函數編寫的,實際上應該具有不同的名稱。現在,如果參數聲明中存在拼寫錯誤,那麼函數內的代碼將直接引用另一個函數,並且該參數將默默無用。

這會好得多:

int countMatchingDescendants(AG ag1,AG ag2,bool (*matchCondition)(AG,AG)) 
{ 
    if(isEmpty(ag2)) return 0; 
    int ret=0; 
    if(matchCondition(ag1,ag2)) ret=1; 
    return ret + countMatchingDescendants(ag1,ag2->pH,matchCondition) + countMatchingDescendants(ag1,ag2->sH,matchCondition); 
} 

bool isContainedSameForm(AG ag1, AG ag2) 
{ 
    if(isEmpty(ag2)) return false; 
    return isContainedSameForm(ag1->pH,ag2->pH) && isContainedSameForm(ag1->sH,ag2->sH); 
} 

int sameFormOcurrences(AG ag1, AG ag2) 
{ 
    return countMatchingDescendants(ag1,ag2,isContainedSameForm); 
} 

請注意,我只是改變了標識的名稱,而不是代碼的結構(函數體之外我也刪除多餘的分號)。但是現在計數代碼有一個通用名稱,表明它實際上有多靈活。

通過更改順序,我防止了泛型計數代碼意外引用具體實現的任何可能性。

+0

這個問題的答案如何? – YePhIcK