我正在学习递归作为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;
}
}
答案 0 :(得分:2)
只是一个提示:你认为在这条路线上有两次城市是否合适?您目前正在建造此类航线。
答案 1 :(得分:2)
这段代码没有任何意义。
变量i永远不会增加。将永远使用城市中唯一的一个连接点。 你为什么要在递归调用中设置?
为什么要创建数组列表只是为了覆盖下一行中对它的唯一引用?
你想要的是Dijkstra's algorithm。 该算法是迭代的,可以找到最短路径长度,可以是最低成本,更少变化或最短持续时间。
答案 2 :(得分:1)
检测循环并将其打破。
你已经诅咒了一件杀死任何递归方法的东西:你没有停止条件。
在将城市添加到连接列表之前,请检查它是否已显示。如果是,则不需要通过递归再次添加它。
每次输入方法时都会继续重新创建Connections列表,因此每次都会忘记之前调用的值。您可以通过启动调试器并在方法开头添加断点来快速证明这一点。每次输入方法时,您都会看到连接列表为空。
更好的解决方案是将该列表传递给方法,以便每次都可以将新值附加到增长列表中。
答案 3 :(得分:1)
简而言之:只有当Connections
包含您要去的城市时,递归方法才会停止递归。由于没有任何内容添加到Connections
,如果最初不是真的,这将永远不会成为现实。
你对变量i
有一些相同的问题:它的值永远不会改变,所以再也没有什么不同。