2015-06-16 36 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,我会说 检查,如果数据是正确的&进一步继续操作上 它。 如果声明来这里。可以有多个检查你可能需要进一步的内部,导致嵌套块用。

这就是说,这些都编码风格并不一定适用于所有的代码。根据逻辑&两者的需求可以互换使用。