我不熟悉在我的方法中使用遞回。我傾向于避開他們有很多原因。但是,對于一個專案,使用遞回方法而不是回圈方法似乎更容易,因為我正在嘗試對圖形進行深度優先遍歷。
由于我不太精通遞回,所以我不明白為什么會出現以下錯誤。
此方法必須回傳 LinkedList.Node 型別的結果
我目前的代碼是:
public Node DFSTime(Node node){
if(node == null){
System.out.println("No path found");
return null;
}
else if(node.element.equals(destinationAirport)){
return node;
}
else{
stack.push(node);
DFSTime(node.nextNode);
}
}
這是未完成的代碼,因為我仍然需要實作一些邏輯,但是,我不明白如何消除錯誤。我缺少一些非常基本的東西嗎?
uj5u.com熱心網友回復:
編譯錯誤的原因很簡單。編譯器清楚地告訴它沒有為所有可能的情況提供回傳的結果。
更重要的是你現在的做法不正確。
由于我正在嘗試對圖形進行深度優先遍歷,因此使用遞回方法而不是回圈方法似乎更容易
有一些關鍵的事情需要考慮:
場
nextNode很可疑。如果每個Node都只擁有一個指向單個節點的參考,那么實際上您根據定義創建的資料結構不是Graph,而是單鏈表。并且為串列實作 DFS 沒有意義。每個節點都應該指向節點的集合,而不是指向單個節點。您必須以某種方式區分未訪問的節點和已訪問的節點。否則你可能會無限遞回。為此,您可以在 中定義一個欄位
boolean,或將每個訪問的節點放入.isVisitedNodeHashSet由于您選擇創建 DFS 的遞回實作,因此您不需要創建stack。只有迭代實作才需要它。
不要過度使用全域變數。我想您可能希望能夠檢查是否可以在不重新實體化圖表的情況下到達目的地的不同機場。
使用 getter 和 setter,而不是直接訪問欄位。這是 Java 中的首選實踐。
您的方法可能看起來像這樣(不必element是型別String,它只是整體想法的說明):
public Node DFSTime(Node node, String destinationAirport){
if(node == null || node.isVisited()) {
return null;
}
if (node.getElement().equals(destinationAirport)) {
System.out.println("The destination airport was found");
return node;
}
node.setVisited(true);
for (Node neighbour: node.getNeighbours()) {
Node result = DFSTime(neighbour, destinationAirport);
if (result != null) return result;
}
return null;
}
節點可能如下所示:
public class Node {
private String element;
private List<Node> neighbours;
private boolean isVisited;
public Node(String element, List<Node> neighbours) {
this.element = element;
this.neighbours = neighbours;
}
public void setVisited(boolean visited) {
isVisited = visited;
}
public boolean isVisited() {
return isVisited;
}
public void addNeighbours(Node neighbour) {
neighbours.add(neighbour);
}
public String getElement() {
return element;
}
public List<Node> getNeighbours() {
return neighbours;
}
}
uj5u.com熱心網友回復:
在 else 關閉后,您應該在函式末尾有一個默認的 return 陳述句。
uj5u.com熱心網友回復:
在方法條件塊(if-else)中,您需要確保從所有條件陳述句中回傳適當的型別,以便沒有編譯時錯誤。在您的情況下, else 塊遞回呼叫DFSTime(..)而不回傳任何內容。
您可能希望回傳通過遞回呼叫呼叫的參考,如下所示:
public Node DFSTime(Node node){
if(node == null){
System.out.println("No path found");
return null;
}
else if(node.element.equals(destinationAirport)){
return node;
}
else{
stack.push(node);
Node node = DFSTime(node.nextNode);
return node;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/472646.html
