La maggior parte delle volte abbiamo bisogno di capire il codice di qualcun altro, ad esempio sto studiando algoritmi grafici dalle risorse online di Sedgewick, il particolare esempio di codice è tratto dall'algoritmo di rilevamento del ciclo here :
private void dfs(Graph G, int u, int v) {
marked[v] = true;
for (int w : G.adj(v)) {
// short circuit if cycle already found
if (cycle != null) return;
if (!marked[w]) {
edgeTo[w] = v;
dfs(G, v, w);
}
// check for cycle (but disregard reverse of edge leading to v)
else if (w != u) {
cycle = new Stack<Integer>();
for (int x = v; x != w; x = edgeTo[x]) {
cycle.push(x);
}
cycle.push(w);
cycle.push(v);
}
}
}
Anche se conosco l'essenza di base dell'algoritmo (trovando il bordo posteriore) e posso capire dal codice che sta tentando di archiviare il ciclo generato, ma non sono in grado di tracciare come l'algoritmo verrebbe eseguito e perché l'autore ha preso un parametro aggiuntivo nel codice dfs
. In generale, come devo procedere per comprendere tali algoritmi ricorsivi?