首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归函数使用的全局变量

递归函数使用的全局变量
EN

Stack Overflow用户
提问于 2011-12-25 21:12:03
回答 3查看 403关注 0票数 1

假设您必须使用dfs (深度优先搜索)实现包含一些算法的Graph类。例如,可能是连接检查,Graph类如下所示:

代码语言:javascript
复制
class Graph {
    void dfsConnected(int v) {
        visited[v] = true;
        //indexing over v's adjacencies and calling dfsConnected recursively
    }
    bool isConnected {
        //indexing over vertice list and calling dfsConnected
    }
}

假设我们有很多算法,在这个类中使用dfs (每个算法都使用特定的dfs)。问题是visited数组:

  • 我们可以将它定义为visitedConnectivityvisitedTopSortingvisitedBridges等每个dfs的私有字段,因此在Graph的每个实例中都会有很多私有变量。如果每个dfs都有3-4个这样的“全局”变量呢?
  • 我们可以将visited作为dfs的参数传递,在这种情况下,每个dfs调用都会有开销。

那么,对于这个问题,最简单、最真实的解决方案是什么呢?当然,它不仅与图形算法有关,而且我发现用dfs术语解释它更容易。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-25 21:20:45

在我看来,更多的OOP方式是为每个DFS类删除一个字段visited,并使其运行自己的DFS.

它将阻止你跟踪‘我分配了什么?它连接到哪里?等等……’“

您的dfs将被封装得更多,需要更少的数据,然后为每个DFS添加一个额外的参数,您必须单独维护这些参数。

这里的性能问题在大多数情况下忽略了可读性和通过在类本身中封装尽可能多的数据而实现的维修性

票数 1
EN

Stack Overflow用户

发布于 2011-12-25 21:13:50

传递visited作为一个参数。没有头顶!

更新,好,我被纠正了。尽管如此,我还是会选择在堆栈中保留一个指针,而不是在函数之外有一个没有意义的字段/全局变量,并在它每天完成之后吃掉内存。

如果您真的关心的话,您可以将DFS封装在一个具有自己的visited字段并将图形作为参数的对象中。但即便如此,这也可能转化为堆栈上带有对象指针的函数调用。

票数 0
EN

Stack Overflow用户

发布于 2011-12-25 21:17:46

你可以使用静态变量!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8631601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档