я родом из фона Python и Haskell, поэтому, когда я должен был написать функцию для подсчета количества фильмов в бинарном дереве, я сделал это так:Mutable против неизменного двоичного обходе дерева в C++
int MovieTree::countMovieNodes(MovieNode* parent)
{
if (parent)
return countMovieNodes(parent->left) + countMovieNodes(parent->right) + 1;
else
return 0;
}
int MovieTree::countMovieNodes()
{ countMovieNodes(root); }
Однако, используя файл заголовка, представленный в классе, я должен был сделать это следующим образом:
void MovieTree::countMovieNodes(MovieNode* parent, int* c)
{
(*c)++;
if (parent->left)
countMovieNodes(parent->left, c);
if (parent->right)
countMovieNodes(parent->right, c);
}
int MovieTree::countMovieNodes()
{
if (!root) return 0;
int c=0; countMovieNodes(root, &c); return c;
}
Я понимаю преимущество первого над последней очень хорошо; каковы преимущества последнего над первым? Это связано с использованием памяти стека, не так ли?
У меня также есть фон в не-C++, поэтому мне любопытно посмотреть, что здесь работает C++. Хороший вопрос. –
Вероятно, нет никаких преимуществ (и обратите внимание, что вы вызываете неопределенное поведение, потому что 'c' никогда не инициализируется до нуля). Вторая версия фактически займет больше места в стеке, потому что она должна выталкивать 'c' в стек. – Cornstalks
Интересно, почему наш профессор заставил нас так поступать тогда ... да. –