java - 深度优先搜索导致 StackOverFlowError

标签 java static-methods depth-first-search

我有一个作业,我必须创建通过有向图运行深度优先搜索,并将遍历作为链接列表返回。我相信 DFS 的代码是正确的,因为它似乎与教科书相符,并且当我逐步完成这些步骤时,它是有意义的。如果我在每个顶点被标记时将其打印出来,它会让打印机一遍又一遍地导致堆栈溢出错误。

 private static boolean[] marked;
 private static LinkedList<Integer> ret;

 public static LinkedList<Integer> dfs(Digraph g, int s) {

     marked = new boolean[g.V()];

    ret = new LinkedList<>();

    marked[s] = true;
    System.out.print(s);

    ret.add(s);



   for (int i : g.adj(s)) {
       if (!marked[i]) {
          dfs(g, i);

     }
   }

   return ret;
  }

我的猜测是每次我调用 dfs 时标记的 boolean[] 都会重置。我尝试将其放在方法之外,但因为该方法是静态的并且我无法更改它(给定赋值参数),所以我遇到了静态非静态问题,我不太确定如何修复。

最佳答案

是的,你的问题确实是因为 boolean 值在某种意义上被重置了。重置发生在这一行:

marked = new boolean[g.V()];

在这一行中,您将在新函数调用中创建一个新的 boolean 数组,该数组与原始数组不同。然后您将检查新数组,其中不包含旧数组的更改。

我建议您创建一个包装函数来初始化 dfs 进程,然后将数组传递到 dfs 函数的每次调用中。

如果您不想添加额外的参数,只需在方法外部创建一个静态变量即可:

private static boolean[] marked;

然后在适当的时候初始化它

关于java - 深度优先搜索导致 StackOverFlowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32061538/

相关文章:

java - 找不到匹配项时 JPA 查询的返回值

java - 工具栏背景正在使用 mipmap 而不是可绘制的

java - 使用 JAX-RS 和 DTO 参数进行 Bean 验证

c# - 静态方法是否共享其局部变量以及在不同线程并发使用期间会发生什么?

java - 如何验证静态 void 方法是否已使用 power mockito 调用

web-crawler - 网络爬虫设计中的 DFS 与 BFS

c++ - 在矩阵中寻找最长的递增路径

java - 在同一个 Selenium 网格节点上运行 PhantomJS 和 Chrome 浏览器

java - 在Java中,静态方法可以返回对象数组作为其结果吗?

java - 用Java构建网站下载器的数据结构