我有以下代码可以很好地检测有向图中的循环。我不喜欢的是return true
出现在条件语句if (!t.isVisited && isCyclicDirected(t))
中。无论true
语句是否通过if
,我都会返回true
。我希望简化此代码以提高可读性。感谢
public boolean isCyclicDirected(Vertex v){
if (v.isVisited){
return true;
}
v.setVisited(true);
Iterator<Edge> e = v.adj.iterator();
while (e.hasNext()){
Vertex t = e.next().target;
if (!t.isVisited && isCyclicDirected(t))
return true;
else return true;
}
return false;
}
以上代码源于重构此代码
public boolean isCyclicDirected(Vertex v){
if (v.isVisited){
return true;
}
v.setVisited(true);
Iterator<Edge> e = v.adj.iterator();
while (e.hasNext()){
Vertex t = e.next().target;
if (!t.isVisited) {
if (isCyclicDirected(t))
return true;
}
else return true;
}
return false;
}
答案 0 :(得分:2)
你的while循环不是循环:在你编写的代码中,你得到一个相邻的顶点,然后你立即返回它是否是循环的,永远不会触及其他顶点:
public boolean isCyclicDirected(Vertex v){
if (v.isVisited){
return true;
}
v.setVisited(true);
Iterator<Edge> e = v.adj.iterator();
while (e.hasNext()) {
Vertex t = e.next().target;
// This while loop never goes beyond the first element.
// you get the first vertex, then return from the
// entire function.
if (!t.isVisited && isCyclicDirected(t))
return true;
else return true;
}
return false;
}
你想要的是评估每个顶点,如果它们中的任何一个是可识别的循环,则返回“true”,否则耗尽你的顶点并返回“false”:
public boolean isCyclicDirected(Vertex v){
if (v.isVisited){
return true;
}
v.setVisited(true);
Iterator<Edge> e = v.adj.iterator();
while (e.hasNext()) {
Vertex t = e.next().target;
// quick test:
if (t.isVisited) {
return true;
}
// elaborate, recursive test:
if(isCyclicDirected(t)) {
return true;
}
}
// none of our adjacent vertices flag as cyclic
return false;
}