2015-06-16 3 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 - для этого случая 1 код хорошо

  1. Если проверить NULL & вернуться сразу вам не нужно, чтобы добавить брекеты ниже еще код, как вы знаете, это не NULL .Нет необходимости писать еще явно. Прямо используйте указатель.
  2. Этот 1-й код имеет меньше брекетов по сравнению со вторым кодом. Там будут меньше вложенных блоков, указывающих указатели, т. Е. Если они действительны, что-то еще, снова проверьте, что указатели делают что-то и т. Д.

Относительно используемых данных - для этого случая 2-й код хорош.

  1. Я бы сказал, прежде всего, никогда не проходят неправильный ввод/parameter.In это случай NULL.Always обязательно пройти правильный вход.

  2. Как вы теперь знаете, что вы никогда не собираетесь передать NULL, я бы сказал проверка, если данные верны & идти дальше к манипуляциям на его. если заявление приходит сюда.Там может быть несколько проверок, вы, возможно, потребуется дополнительно внутри, что приводит к вложенных блоков с в.

При этом, эти и кодирования стили не всегда применимы ко всем кодам. В зависимости от логики & необходимо, чтобы оба варианта могли быть взаимозаменяемы.

Смежные вопросы