我正在经历由我的导师设计的'generictree'课程,并且无法理解一个概念。 其中有一个函数返回给用户,包含最高值的节点是下面的代码。
const Node<T> * getLargestNode() const {
return getLargestNodeHelper(root);
}
我知道我们需要一个辅助函数,因为我们需要递归地执行它,因此需要一个参数。因此,需要辅助函数将根作为参数传递,因为root不能作为参数从main函数传递,因为不需要访问内部数据成员。 以下是辅助函数
的代码private:
static const Node<T> * getLargestNodeHelper(const Node<T> * node) {
if (node == NULL) {
return NULL;
}
const Node<T> * largest = node;
for (int i = 0; i < node->children.size();i++) {
const Node<T> * childlargest = getLargestNodeHelper(node->children[i]);
if (childlargest->data > largest->data) {
largest = childlargest;
}
}
return largest;
}
现在,当我尝试自己创建相同的类时,我创建了如下所示的辅助函数,
private:
const Node<T> * getLargestNodeHelper(const Node<T> * node) const {
if (node == NULL) {
return NULL;
}
const Node<T> * largest = node;
for (int i = 0; i < node->children.size();i++) {
const Node<T> * childlargest = getLargestNodeHelper(node->children[i]);
if (childlargest->data > largest->data) {
largest = childlargest;
}
}
return largest;
}
现在,我怀疑的是,使用我的helper-function版本是否有任何不利之处。两者之间有什么区别,因为两者都无法更改数据成员,并且两者都无法从对象中调用?
答案 0 :(得分:2)
如果您的方法不是静态的,则需要该类的对象才能调用它(即使它不关心您调用它的对象)。这取决于具体情况 - 创建虚拟对象并销毁它的开销,只需使用一次即可调用。
可以在没有对象的情况下调用静态方法。
答案 1 :(得分:0)
在您的简单示例中,没有任何有用的区别,因为getLargestNode()始终需要一个对象。但是在更复杂的类中,可能存在需要这种辅助函数的其他公共但静态成员函数。在这种情况下,无法调用您的函数(代码不会被重用)。还有一件事是速度和记忆(对于非常有限的系统)。带有指向对象的指针的参数可以在堆栈中占据一席之地(在某些系统中)。 getLargestNodeHelper()以递归方式调用,因此需要更多内存和更多时间。
这完全是关于重用代码的。并且不要超过它所要求的递归函数。