需要相同递归函数的私有和公共方法

Posted

技术标签:

【中文标题】需要相同递归函数的私有和公共方法【英文标题】:Needing a private and public method for the same recursive function 【发布时间】:2015-08-22 07:08:24 【问题描述】:

我们最近一直在为我的计算机科学课上的 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) 的私有版本然后允许公共用户找到列表的最大值,而没有机会访问和弄乱私有头部。

谢谢大家!干杯。

【问题讨论】:

她提到在为一个类实现递归函数时,你需要该函数的公共和私有版本。:告诉她private 方法怎么样递归被命名为findMax_recursion() 会有什么不同吗?我的观点是,她所说的是个人指令,不一定是好的做法。 "她提到在为一个类实现递归函数时,您需要同时拥有该函数的公共和私有版本" - C++ 中没有这样的要求。也许这是她的要求,但这只是一种编码风格。 公共函数不是递归的。 【参考方案1】:

“我的直觉是,也许这样做是为了确保使用公共类方法的人不会进入完全的 dingus 模式并最终调用带有不会导致停止的参数的递归函数/基本情况。”

你的直觉在某种程度上是正确的。 head 由类在内部进行管理,不应作为调用者的参数引入。

与递归没有特定的相关性,而是数据封装 OOP 原则:

head 应该在内部由类管理,尽管函数 findMax() 应该在公共类接口中可用。为了提供适当的内部实现,搜索被委托给private 实现,在这种情况下递归使用。但这并不重要。


至于您对问题的修改。您应该将尽可能多的代码放入private 函数中,并使其保持狭窄。我看不出任何原因,为什么你的教授将这些放在公共功能中。

【讨论】:

我认为可能是这种情况,它与递归无关。您能从 OOP 的角度简要解释一下这样做的逻辑吗?我觉得好像我差不多明白她为什么这样做了,但我还没有完全理解。 非常感谢您,现在这更有意义了!我还有一个问题,如果您有时间,我将编辑成大部分问题。谢谢谢谢! @KurtMadland “我将编辑大部分问题” 请不要!请在此处一次提出一个问题。 抱歉,好吧,那没关系,谢谢您的帮助!【参考方案2】:

这是你必须做的事情吗?

没有。

这只适用于递归的类方法吗?

甚至没有。

如果是这样,那么递归函数如何使这变得必要?

什么都没有。

你会为其他功能这样做吗?

是的,我愿意。这是您在组织代码方面做出的选择。一般来说,我的public 类成员函数调用的函数是private,除非有任何内在需要它们也是public

她提到,在为类实现递归函数时,您需要同时拥有该函数的公共和私有版本。

假设这几乎是逐字逐句,你的老师要么错了,要么不清楚。 (也有可能她将“选择”的元素留给未来的课程;这是否符合道德/合理还有待商榷。)

也有人可能会争辩说,在这种情况下,她通过给两个 findMax 重载命名相同的名称来误导您; findMax()findMax(Head*)两个独立的函数,你可以(我会)调用后者findMaxImpl(Head*),或者类似的东西。然后你会看到递归和这个没有任何关系。

我的直觉是,这样做可能是为了确保使用公共类方法的人不会进入完全的 dingus 模式并最终调用带有不会导致停止/基本情况的参数的递归函数。

有趣的是,您的直觉在这里比 C++ 实际要明智得多。 :P 语言中没有任何东西可以防止甚至尝试来防止“完全 dingus 模式”。不是真的。

【讨论】:

@πάνταῥεῖ:“不是真的”?哇,这些天来获得 SO 代表太容易了! ;)

以上是关于需要相同递归函数的私有和公共方法的主要内容,如果未能解决你的问题,请参考以下文章

C语言学习笔记--递归函数

javaScript 递归 闭包 私有变量

在 C++ 中的类中初始化与公共和私有相同的函数:它是如何工作的?

讲一下c语言中递归函数的使用方法有哪些?

Python进阶 —— 尾递归

关于回调和递归思想的理解