Le ricorsioni sono intrinsecamente meno sicure delle iterazioni?

3

Java non ha un limite di profondità di ricorsione predefinito. Di conseguenza la ricorsione di seguito (un metodo fittizio che restituisce il valore) genera java.lang.StackOverflowError dopo le iterazioni 62844 (con statico) e 14002 (senza statico).

public static int testRecursion(int number) {
    if (number == 1) {
        return 1;
    } else {
        int result = 1 + testRecursion(number - 1);
        return result;
    }    
}


public int testIteration(int number){
int result = 0;
while (number > 0){
     result++;
     number--;
     }
return result;
}

Ho due dubbi:

  1. Il metodo di iterazione funziona correttamente per tutti i valori positivi int, mentre la ricorsività genera un'eccezione
  2. Le modifiche a un metodo modificano la profondità di ricorsione alla quale verrà generata l'eccezione.

La ricorsione in Java sembra un modo per aggiungere bug fluttuanti. La profondità di ricorsione è maggiore di un numero magico? Il programma genera un'eccezione. Metodo ricorsivo modificato dall'autore - la profondità di ricorsione consentita è diminuita e viene nuovamente generata un'eccezione.

Le ricorsioni sono ampiamente usate in Java. Significa che il limite di ricorsione è raramente raggiunto in situazioni pratiche? O ci sono alcuni metodi generali e robusti per gestire il limite di profondità di ricorsione mobile?

Ho letto queste domande:

Ma nessuna di queste domande discute un problema di profondità di ricorsione in Java.

    
posta sixtytrees 25.07.2016 - 20:31
fonte

1 risposta

9

I risultati del limite di ricorsione sono indicati dai messaggi corrispondenti e una ricorsione può essere facilmente riscritta come iterazioni. Ciò rende il rilevamento e la correzione facili.

Le ricorsioni vengono in genere utilizzate in situazioni in cui la profondità di ricorsione è bassa. Come sottolineato da Ordous, il parametroXss può essere regolato per risolvere i casi limite.

Le chiamate ricorsive profonde dovrebbero essere evitate. I loop stretti non sono adatti alle chiamate ricorsive.

    
risposta data 25.07.2016 - 21:02
fonte

Leggi altre domande sui tag