我在谷歌上找到了這段代碼,但我找不到遞回部分實際上是如何作業的。該代碼是關于在有向圖上找到 2 個頂點之間的可能路徑。這是列印總可能路徑的方法:
public void total_path(int source, int destination)
{
result = 0;
boolean[] visit = new boolean[size];
for(int i = 0; i < size; i )
{
visit[i] = false;
}
count_path(source, destination, visit);
System.out.println(result);
}
這是計算所有可能路徑的遞回方法:
public void count_path(int start, int end, boolean[] visit)
{
if(start > size || end > size || start < 0 || end < 0 || node == null)
{
return ;
}
if(visit[start]==true)
{
return;
}
if(start == end)
{
result = result 1;
}
visit[start] = true;
AjlistNode temp = node[start].next;
while(temp!=null)
{
count_path(temp.id, end, visit);
temp = temp.next;
}
visit[start]=false;
}
這是我創建的圖表:
g.addEdge(0, 1);
g.addEdge(1, 2);
g.addEdge(1, 3);
g.addEdge(2, 5);
g.addEdge(3, 4);
g.addEdge(4, 2);
g.addEdge(4, 5);
g.addEdge(5, 6);
我已經編譯并運行了起點為 0,終點為 6 的程式。結果是 3,已經在 YouTube 上查找了有關該演算法的內容,但我仍然無法理解如何可視化以及代碼如何在while 回圈內的遞回部分。
uj5u.com熱心網友回復:
遞回函式必須包含一個基本情況來回傳一個值而不是遞回呼叫的結果。在這種情況下:
if(start > size || end > size || start < 0 || end < 0 || node == null)
{
return;
}
if(visit[start]==true)
{
return;
}
是那些會破壞遞回呼叫鏈的基本情況。請記住,該方法count_path回傳void. 如果該方法需要回傳某個值,您會看到這些if塊回傳某種默認值。例如,當您看到遞回斐波那契的示例時Fib(0),Fib(1)回傳輸入值的基本情況。否則,它回傳(累積)遞回呼叫的結果。
這些基本情況是什么?
該方法計算從當前節點到某個目標節點的路徑數。因此,如果節點已經被訪問過(因此路徑應該已經計算過),只需回傳而不重新計算。此外,如果您的圖中只有一個節點,或者沒有節點,則沒有路徑(因此無需計算即可回傳)。
為什么答案是3條路徑?
下圖基于為添加邊緣所做的呼叫。每個條目都是從起始節點到結束節點的單向路徑。因此,從節點 0 開始,到節點 6,共有 3 條路徑,它們在附圖中進行了概述。

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/383349.html
