编写路由程序,Java递归困难

时间:2019-11-30 04:56:07

标签: java

因此,我正在编写一个程序,将一个人从地铁系统的一个站点转到另一个站点。这是想法:

  • 开始起跑,弄清楚它在哪行。然后检查它是否与目标停靠点位于同一行
  • 如果已打印,则打印所需的路径。经过测试,这部分实际上是有效的。
  • 如果没有,则在每条线上上下移动一个挡块并进行相同的检查。

它给了我无法解决的堆栈溢出。尝试调试无济于事。

public ArrayList<Station> findRoutesBetween(Station start, Station target) {
    ArrayList<Station> path = new ArrayList<Station>();

    for (Route route : findRoutes(start)) {
        ArrayList<Station> stops = route.getStops();
        boolean sameRoute = findRoutes(target).contains(route);
        int stopIdstart = stops.indexOf(start);
        int stopIdtarget = stops.indexOf(target);
        if (sameRoute && stops.contains(start)) {
            if (stopIdtarget > stopIdstart) {
                path.addAll((stops.subList(stopIdstart, stopIdtarget + 1)));
                return path;
            } else {
                List<Station> temp = stops.subList(stopIdstart, stopIdtarget + 1);
                Collections.reverse(temp);
                path.addAll(temp);
                return path;
            }
        } else {
            if (stopIdstart != stops.size() - 1) {
                System.out.println("hh");
                ArrayList<Station> t = findRoutesBetween(stops.get(stopIdstart + 1), target);
                System.out.println(t.toString());
            }
            if (stopIdstart != 0) {
                System.out.println("hh");
                ArrayList<Station> t = findRoutesBetween(stops.get(stopIdstart - 1), target);
                System.out.println(t.toString());
            }
        }

    }
    return path;
}

函数findroutes()仅返回停止点所在的所有行。

1 个答案:

答案 0 :(得分:0)

您的实施不会忽略您已经检查或继续的站。这意味着您有时可能会通过给定的路线从车站A到达车站B。然后,当您在B站时,请检查所有可能的站并再次查看A站。然后,您再次回到A站,重新开始并再次找到B站。现在,您将在无休止的递归方法调用中在这些工作站之间来回跳转,直到获得StackOverflowError

保留已检查的电台列表,并且在列表中不再检查电台。所以你会得到类似的东西:

  

好的,我在K站,根据可用路线查看R,G,W,Z,C,I和L站。但是,我已经跳过了电台W,Z和C。因此,让我们接下来仅检查R,G,I和L站...

出于调试目的,您可以打印输入到方法中的参数(或来自Station对象的某些数据,例如站名)。这样一来,您可能已经注意到,您看到相同的工作站重复进入方法。