Sì, c'è un altro modo per limitare la profondità della ricorsione, ma non lo incoraggerei .
In generale, possiamo dire che stai attualmente utilizzando un approccio basato sui dati.
public void myMethod(File arg, int accumulator) {
dove accumulator
conta la profondità della chiamata di ricorsione.
L'altro modo è enumerare le chiamate. Detto in altro modo, codifica le chiamate:
private void myMethodSnippedCode(/*args*/) {
//...snipped...
}
public void myMethod(File arg) {
myMethodSnippedCode(/*whatever*/);
// File newArg= ...; // ... code is moved to the myMethod1 call below
// Exception removed. Why would you throw an exception?
myMethod1(...); // the ... is where your new File is created
}
private void myMethod1(File arg) {
myMethodSnippedCode(/*whatever*/);
myMethod2(...);
}
private void myMethod2(File arg) {
myMethodSnippedCode(/*whatever*/);
myMethod3(...);
}
private void myMethod3(File arg) {
myMethodSnippedCode(/*whatever*/);
// don't make any more calls
}
Che comprensione del codice e incubo di manutenzione . Se dobbiamo cambiare il numero di livelli richiesti o introdurre altre modifiche, qualcuno inevitabilmente si sbaglia.
Attacca con una bella ricorsione pulita che tutti capiranno:
public void myMethod(File arg, int depth) {
// [snipped code body]
if (depth< 3)
myMethod(..., ++depth); // the ... is where your new File is created
}
BTW, la chiamata iniziale a myMethod
richiede che il chiamante passi zero. Cosa succederà se superano 6? O -21? La soluzione a questo è di avvolgere la prima chiamata
public void myMethod(File arg) {
myMethodWorker(arg, 0);
}
private void myMethodWorker(File arg, int depth) {
// [snipped code body]
if (depth < 3)
myMethodWorker(..., ++depth); // the ... is where your new File is created
}