我们最近一直致力于为我的计算机科学课在C ++中为几个类(树,堆,队列,链表等)实现递归方法。我编写这些方法的实现时没有遇到任何麻烦,但是我的教授简单地提到了一些让我感到困惑的事情,她从来没有详细阐述过这一点。
她提到在为类实现递归函数时,您需要同时拥有该函数的公共版本和私有版本。
例如(链表类定义的一部分):
public:
// constructors, destructors
// member functions etc.
findMax() { findMax(head); }
private:
findMax(Node* first_node) { // actual code with recursive calls }
Node* head;
所以这里有两个功能,一个是私人的,一个是公共的。所有公共函数都会调用私有函数并返回它发现的任何答案。
我对此有几个问题。
这是你必须做的吗? 这仅适用于递归的类方法吗?如果是这样,递归函数怎么做才有必要呢?你会为其他功能做这个吗?
我的直觉是,这可能是为了确保使用公共类方法的人不会进入完全dingus模式并最终调用递归函数,其参数不会导致停止/基本情况。
任何人都可以详细阐述这个想法并以直观的方式解释它吗?
谢谢!
编辑:谢谢大家的快速回答,他们非常乐于助人!我想我可能听错了我的教授,这实际上与递归无关(虽然她写的例子可能已经存在),而且只是面向对象编程中的一种约定。OOP中的想法是findMax()需要使用私有类变量(head)才能使用,但这将是一个方便的公共函数。然后,私有版本的findMax(Node * n)允许公共用户查找列表的最大值,而无法访问并弄乱私有头。
谢谢大家!欢呼声。
答案 0 :(得分:4)
"我的直觉是,这可能是为了确保使用公共类方法的人不会进入完全的dingus模式并最终调用带有参数的递归函数来赢得' t导致停止/基础情况。"
你的直觉在某种程度上是正确的。 head
在内部使用该类进行管理,不应作为来自调用者的参数引入。
与递归无关,而是数据封装OOP原则:
应该在内部从类中管理 head
,尽管公共类接口中应该有一个函数findMax()
。为了提供适当的内部实现,搜索被委托给private
实现,在这种情况下,递归使用。但这并不像提到的那样重要。
至于你在问题中的编辑。您应该将尽可能多的代码放入private
函数中,并将其缩小。我看不出任何理由,为什么你的教授将这些放在公共职能部门。
答案 1 :(得分:0)
这是你必须做的事吗?
没有
这仅适用于递归的类方法吗?
甚至没有。
如果是这样,那么递归函数又有必要吗?
没有
你会为其他功能做这件事吗?
是的,我愿意。您可以选择组织代码。通常,我的public
类成员函数调用的函数是private
,除非它们的任何固有需求也是public
。
她提到在为类实现递归函数时,您需要同时拥有该函数的公共版本和私有版本。
假设这接近逐字,你的老师要么错了,要么不清楚。 (也有可能她将离开“选择"未来的教训”的元素;这是否合乎道德/合理是否值得辩论。)
有人可能会争辩说,在这种情况下,她通过赋予两个findMax
重载相同的名称来误导你; findMax()
和findMax(Head*)
是两个单独的函数,你可以(我会)调用后者findMaxImpl(Head*)
,或类似的东西。然后你会看到递归与此无关。
我的直觉是,这可能是为了确保使用公共类方法的人不会进入完全dingus模式并最终调用递归函数,其参数不会导致停止/基本情况。
有趣的是,你的直觉比C ++实际上要敏感得多。 :P语言中没有任何内容可以阻止甚至尝试来防止"完全dingus模式"。不是真的。