【问题标题】:Recursive method will not move on and remains in an infinite loop (Java )递归方法不会继续并保持在无限循环中(Java)
【发布时间】:2011-09-25 13:10:31
【问题描述】:

我正在学习递归作为 Java 教程的一部分,我正在寻求一些帮助。

我们需要编写一个递归 Java 程序,它会计算出在没有直飞航班的情况下如何从一个城市到达另一个城市。

我的问题是我得到了一个似乎只尝试两个城市的无限循环,然后代码一次又一次地重复。

如果可以的话,我将不胜感激。

我不想让你们用代码溢出,所以我会提出你们应该需要的方法。如果您需要更多,我很乐意添加更多代码。

public boolean determineRoute(City from, City to, ArrayList<City> flightRoute) {

    int i = 0;

    ArrayList<City> Connections = new ArrayList<City>();

    // the Connections value takes all the connecting cities we can travel to from a departure point
    Connections = from.getConnections();

    // searches in the connecting cities from the current city as to if it contains the city we wish to travel to
    if (Connections.contains(to)) {
        System.out.println("Congrats you can go their cause one of its connecting cities is the to city that u wanna go to");
        return true;
    } else {
        // add connecting city to list for future reference
        flightRoute.add(Connections.get(i));
        System.out.println(Connections.get(i) + " added to flight route");
        // saves current connection
        City theCity = Connections.get(i);
        // recursive part which sends a new from city for analysis until the city we want to travel to arises
        determineRoute(from = Connections.get(i), to, flightRoute);
        return true;
    }

}

【问题讨论】:

    标签: java recursion infinite-loop


    【解决方案1】:

    只是一个提示:您认为在路线上设置两次城市是否合适?您目前正在构建此类航线。

    【讨论】:

      【解决方案2】:

      这段代码毫无意义。

      变量 i 永远不会递增。一个城市的唯一一个连接将被使用。 为什么要在递归调用中设置?

      为什么你创建一个数组列表只是为了覆盖下一行中对它的唯一引用?

      你想要的是Dijkstra's algorithm。 该算法是迭代的,会找到最短的路径长度,这可能是成本最低、更改更少或持续时间最短的。

      【讨论】:

      • 它看起来非常复杂,但我还是试试吧
      • 如果路线确定很容易,那么我想卫星导航会更有用。
      【解决方案3】:

      检测循环并打破它。

      你诅咒了自己,一件事情会扼杀任何递归方法:你没有停止条件。

      在将城市添加到连接列表之前,请检查它是否已经出现。如果有,就不需要再递归添加了。

      每次输入方法时都会重新创建连接列表,因此每次都会忘记上一次调用的值。您可以通过启动调试器并在方法开始处添加断点来快速证明这一点。每次输入方法时都会看到连接列表为空。

      更好的解决方案是将该列表传递给方法,以便每次都可以将新值附加到不断增长的列表中。

      【讨论】:

      • 但我以为我已经用 if 语句 if (Connections.contains(to)) 做到了这一点
      • 显然不是;如果是,你就会停下来。
      • 您能否建议一种编写此代码的方法,以便我可以走上正轨?谢谢
      【解决方案4】:

      简而言之:只有当Connections包含你想去的城市时,递归方法才会停止递归。由于从未向 Connections 添加任何内容,因此如果最初不是真的,这将永远不会成为真的。

      变量i 也有类似的问题:它的值永远不会改变,所以再一次,没有什么不同发生。

      【讨论】:

      • 但是这行代码在做什么 flightRoute.add(Connections.get(i));这是在列表中添加一个城市吗?
      • 它正在向flightRoute 添加一些内容,但根据flightRoute 的内容,没有任何内容退出循环;循环只关心Connections 中的内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 2012-10-24
      相关资源
      最近更新 更多