2015-06-16 38 views
1

這些函數會給出相同的輸出,並且它們都是正確的,但是我想知道哪些以編程方式更合適?是否應該指定退貨條件?

代碼1:

void inorder(node *t){ 
    if(t==NULL) 
     return; 
    else{ 
     inorder(t->left); 
     cout<<t->data<<" "; 
     inorder(t->right); 
     return; 
    } 
} 

代碼2:

void inorder(node *t){ 
    if(t){ 
     inorder(t->left); 
     cout<<t->data<<" "; 
     inorder(t->right); 
    } 
} 

這裏節點是二進制樹的一個節點,其具有結構:

struct node{ 
    int data; 
    node *left; 
    node *right; 
}; 
+3

第二個比第一個好。你可以通過刪除'else {'和匹配的'}'和第二個'return'來改進第一個。那也是可以接受的。 –

+0

如果你必須做一個明確的比較,你應該與'nullptr'比較:) –

回答

2

第二個看起來更好。

不過,我個人比較喜歡這樣的:

void inorder(node * t){ 
    if(t==NULL) 
     return; 

    inorder(t->left); 
    cout<<t->data<<" "; 
    inorder(t->right); 
} 

這是明確(你不打算做任何事情,如果t是NULL)和避免了不必要的塊(因而壓痕)通過刪除其他。這個方法也增加了可讀性並且使得代碼簡潔(認爲是的更大的功能和/或塊,並且移除了不必要的否則 s)。

我可能會重構這個功能,使得這二爲:

//Use const wherever possible! 

void inorder(std::ostream & out, node const * t){ 
    if(t==NULL) 
     return; 

    inorder(out, t->left); 
    out<<t->data<<" "; //write to any output stream 
    inorder(out, t->right); 
} 

void inorder(node const * t){ 
    inorder(std::cout, t); //write to stdout 
} 

這樣,你甚至可以打印樹一個文件,如果使用的第一功能,如:

std::ofstream file("inorder.txt"); 

inorder(file, tree); 

希望這有助於。

0

關於代碼readbility - 如果你檢查NULL &立即返回你不需要加括號低於其他代碼,因爲你知道這不是空的這種情況下的第一代碼是好的

  1. 不需要寫否則顯式。直接使用指針。
  2. 與第二代碼相比,此第一代碼的大括號較少。檢查指針的嵌套塊將會減少,也就是說,如果有效,則再次檢查指針是否執行某些操作等。

關於使用的數據 - 對於這種情況第二代碼是好的。

  1. 我想說首先,從來沒有過一個錯誤的輸入/ parameter.In這種 情況NULL.Always一定要通過正確的輸入。

  2. 正如你現在知道你永遠不會傳遞NULL,我會說 檢查,如果數據是正確的&進一步繼續操作上 它。 如果聲明來這裏。可以有多個檢查你可能需要進一步的內部,導致嵌套塊用。

這就是說,這些都編碼風格並不一定適用於所有的代碼。根據邏輯&兩者的需求可以互換使用。