Java 我的方法没有';无法达到预期的返回语句
我已经盯着这个看了好几个小时,不知道出了什么问题 我正在尝试实现一种方法,使用深度优先搜索算法确定图中两个顶点之间是否存在路径 然而,虽然它似乎成功地找到了它需要找到的顶点,但它没有到达return语句 我尝试过使用不同的变量,打印东西,更改订单,但无法使其返回真值。任何帮助都将不胜感激Java 我的方法没有';无法达到预期的返回语句,java,Java,我已经盯着这个看了好几个小时,不知道出了什么问题 我正在尝试实现一种方法,使用深度优先搜索算法确定图中两个顶点之间是否存在路径 然而,虽然它似乎成功地找到了它需要找到的顶点,但它没有到达return语句 我尝试过使用不同的变量,打印东西,更改订单,但无法使其返回真值。任何帮助都将不胜感激 public class Path<V,E> { private HashMap<V,Boolean> visited = new HashMap<V,Boolean>()
public class Path<V,E> {
private HashMap<V,Boolean> visited = new HashMap<V,Boolean>();
public boolean pathExists(Graph<V,E> graph, V v1, V v2) {
if (v1.equals(v2)) {
System.out.println("v1 = v2");
return true;
}
if (!visited.containsKey(v1)) {
System.out.println("v1 discovered: "+v1);
visited.put(v1, true);
}
for (V v : graph.getNeighbors(v1)) {
if (v.equals(v2)) {
visited.clear();
System.out.println("v discovered: "+v);
return true;
}
if (!visited.containsKey(v)) {
visited.put(v,true);
System.out.println("visited doesn't contain v: "+v);
System.out.println("starting new search with "+v);
pathExists(graph,v,v2);
}
}
visited.clear();
return false;
}
public static void main(String[] args) {
MyGraph<String,String> mg = new MyGraph<String,String>();
Path<String,String> path = new Path<String,String>();
mg.insertVertex("utrecht");
mg.insertVertex("amsterdam");
mg.insertVertex("maastricht");
mg.insertEdge("utrecht", "amsterdam", "route1", 2);
mg.insertEdge("amsterdam", "maastricht", "route2", 1);
boolean c = path.pathExists(mg, "utrecht", "maastricht");
System.out.println(c);
}
}
公共类路径{
private HashMap visited=新建HashMap();
公共布尔路径存在(图形,vv1,vv2){
如果(v1等于(v2)){
System.out.println(“v1=v2”);
返回true;
}
如果(!已访问。容器(v1)){
System.out.println(“v1发现:+v1”);
visited.put(v1,true);
}
for(V:graph.getNeights(v1)){
如果(v等于(v2)){
已访问。清除();
System.out.println(“v发现:+v”);
返回true;
}
如果(!已访问。容器(v)){
访问。放置(v,true);
System.out.println(“已访问的不包含v:+v”);
System.out.println(“用“+v”开始新的搜索);
路径存在(图,v,v2);
}
}
已访问。清除();
返回false;
}
公共静态void main(字符串[]args){
MyGraph mg=新的MyGraph();
路径路径=新路径();
mg.insertVertex(“乌得勒支”);
mg.insertVertex(“阿姆斯特丹”);
mg.insertVertex(“马斯特里赫特”);
mg.insertEdge(“乌得勒支”、“阿姆斯特丹”、“1号公路”、2号公路);
mg.insertEdge(“阿姆斯特丹”、“马斯特里赫特”、“路线2”,1);
布尔c=path.pathExists(mg,“乌得勒支”、“马斯特里赫特”);
系统输出打印ln(c);
}
}
这是控制台输出
v1 discovered: utrecht<br>
visited doesn't contain v: amsterdam<br>
starting new search with amsterdam<br>
v discovered: maastricht<br>
false<br>
v1发现:乌得勒支
已访问不包含v:amsterdam
从阿姆斯特丹开始新的搜索
v发现:马斯特里赫特
假
由于它正在打印“v discovered:maastricht”,我希望它返回true,但它返回false。程序中有两个主要错误
true
,但不使用返回值。由于您的方法是递归的,因此返回值将丢失
而不是
pathExists(graph,v,v2);
你应该写
if(pathExists(graph,v,v2)) return true;
首先,它根本不需要,除非您需要在访问后重新使用已访问的地图。但即使在这种情况下,最好在您的方法之外清除它。
虽然
if(v.equals(v2))
下的visitored.clear()
不是一个真正的问题(除了前面的备注),但是for循环之后的第二个问题将创建bug。
例如,考虑下面的顶点及其邻接表:
1 -> [2, 4]
2 -> [3]
4 -> [1, 5]
5 -> []
假设您查找顶点5
,然后从顶点1
开始。您将访问vertex2
和vertex3
。您访问的地图包含[1,2,3]
。A顶点3
的pathExists
末端存在,因为您没有找到5
和3
作为无邻居,所以您可以清除已访问的地图。然后访问顶点4
,由于已清除地图,因此它只包含[4]
。因此,您再次访问1
,依此类推
映射。只需创建一个集
,并检查是否存在顶点
欢迎来到堆栈溢出!看起来您可能需要学习使用调试器。请随便吃点。如果以后仍有问题,请将问题更具体地说明您需要什么帮助。您在for循环中返回true,它只退出for循环,而不退出方法。相反,将标志设置为true,返回for循环,如果该标志在方法上设置为true,则返回true谢谢Ricola,这对我帮助很大,该方法现在可以正常工作并正确发现所有路径!