2011-03-30 69 views
0

說我有以下幾點:遞歸布爾函數

bool signal(QtreeNode * & orig, QtreeNode * & n, int tolerance) { 

    bool signal1= false, signal2= false, signal3= false, signal4= false; 
    if(n->isLeaf()){ 
     if(totalDiff>tolerance) //suppose these were defined 
      return true; 
     else return false; 
    } 
    signal1=signal(orig, n->neChild, tolerance); 
    signal2=signal(orig, n->nwChild, tolerance); 
    signal3=signal(orig, n->swChild, tolerance); 
    signal4=signal(orig, n->seChild, tolerance); 

    if(signal1 || signal2 || signal3 || signal4) 
     return true; 
    else return false; 
} 

而且說我叫一些包裝方法像這樣的方法:

signal1=signal(orig, n, tolerance); 
    if(signal1) 
     //do something 

所以我在做什麼這裏穿越整個四分之一樹尋找只有一個情況下,我變得真實。我需要的功能是在totalDiff大於容差的情況下返回true。我擔心我所擁有的不是做我希望做的事。看看函數,看起來像,當我在我的包裝方法中設置signal1時,如果僅發現1個該情況,我將返回true?還是我做錯了?

回答

1

你會用這種方法擊打四叉樹的每一片葉子。相反,只要你找到它,你就想休息一下。要做到這一點,你需要改變

signal1=signal(orig, n->neChild, tolerance); 
signal2=signal(orig, n->nwChild, tolerance); 
signal3=signal(orig, n->swChild, tolerance); 
signal4=signal(orig, n->seChild, tolerance); 

if(signal1 || signal2 || signal3 || signal4) 
    return true; 
else return false; 

return signal(orig, n->neChild, tolerance) || 
     signal(orig, n->nwChild, tolerance) || 
     signal(orig, n->swChild, tolerance) || 
     signal(orig, n->seChild, tolerance); 
2

功能看起來是正確的,但我有一些文體意見。首先,嘗試將其稱爲別的,signal是POSIX操作系統中非常常見的功能。其次,我要麼在if語句中包含實際的函數調用,要麼只有4個if語句,每個語句都返回到短路評估和(主觀)清理代碼。也就是說,無論是:

return (signal(orig, n->neChild, tolerance) || 
     signal(orig, n->nwChild, tolerance) || 
     signal(orig, n->swChild, tolerance) || 
     signal(orig, n->seChild, tolerance)); 

或:

if (signal(orig, n->neChild, tolerance)) 
    return true; 
if (signal(orig, n->nwChild, tolerance)) 
    return true; 
if (signal(orig, n->swChild, tolerance)) 
    return true; 
if (signal(orig, n->seChild, tolerance)) 
    return true; 
return false; 

最後,我想補充一點,我會創建一個新的類從QtreeNode獲得該實現的方法像nodeDifference或只是將它加入如果你控制QtreeNode的來源,它可以進一步清理你的代碼,即

bool signal(QtreeNode *&orig, QtreeNode *&n, int tolerance) { 
    if (n->isLeaf()) 
    return (orig->nodeDifference(*n) > tolerance); 
    else 
    return (signal(orig, n->neChild, tolerance) || 
      signal(orig, n->nwChild, tolerance) || 
      signal(orig, n->swChild, tolerance) || 
      signal(orig, n->seChild, tolerance)); 
}