примите следующую функцию:
int binaryTree::findHeight(node *n) {
if (n == NULL) {
return 0;
} else {
return 1 + max(findHeight(n->left), findHeight(n->right));
}
}
Довольно стандартная рекурсивная treeHeight
функция для заданного бинарного дерева поиска binaryTree
. Теперь, я помогал другу (он проходит курс алгоритмов), и я столкнулся с какой-то странной проблемой с этой функцией, которую я не мог на 100% объяснить ему.
Когда max определено как max(a,b) ((a)>(b)?(a):(b))
(что является максимальным определением в windef.h
), рекурсивная функция выходит из строя (она запускается примерно в n^n
раз, где n
- высота дерева). Это, очевидно, делает проверку высоты дерева с 3000 элементами очень и очень долгой.
Однако, если max определяется с помощью шаблонов, как это делает std
, все в порядке. Так что использование std::max
решило его проблему. Я просто хочу знать, почему.
Кроме того, почему функция countLeaves
работает нормально, используя ту же программную рекурсию?
int binaryTree::countLeaves(node *n) {
if (n == NULL) {
return 0;
} else if (n->left == NULL && n->right == NULL) {
return 1;
} else {
return countLeaves(n->left) + countLeaves(n->right);
}
}
Это потому, что при возврате троичной функции значения a => countLeaves(n->left)
и b => countLeaves(n->right)
были рекурсивно дважды вызваны просто потому, что они были результатом?
Спасибо!
На вопрос был дан ответ ниже
Я просто хотел связать некоторую литературу по этому вопросу для дальнейшего использования:
http://www.boostpro.com/tmpbook/preprocessor.html
http://msdn.microsoft.com/en-us/library/z3f89ch8.aspx
Основное различие между двумя реализациями:
#define max(i, j) (((i) > (j)) ? (i) : (j))
против
template<class T> T max (T i, T j) { return ((i > j) ? i : j) }
Спасибо всем!