2017-07-10 2 views
0

J'essaie d'imprimer des nombres de 1 à 10 sans utiliser de boucles en java. Lorsque n + 1 est passé à l'appel de méthode recursivefun à la ligne 6, cela fonctionne correctement. Mais lorsque n ++ est passé, le code renvoie une erreur:/Mes codes donnent une exception en utilisant la fonction récursive

public class PrintWithoutUsingLoops { 

    public static void recursivefun(int n) { 
     if (n <= 10) { 
      System.out.println(n); 
      recursivefun(n++);//an exception is thrown at this line. 
     } 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     recursivefun(1); 
    } 

} 
+5

Alors, quelle est l'exception? Un débordement de pile, par hasard? Avez-vous traversé le code dans un débogueur? Quel est le résultat, et qu'espériez-vous qu'il soit? (Vous devriez être en mesure de déterminer pourquoi il échoue simplement en fonction de la sortie ...) –

Répondre

5
recursivefun(n++); 

passe la valeur initiale de n à l'appel récursif (puisque vous utilisez l'opérateur de post-incrémentation), ce qui rend cette récursion infinie (puisque chaque appel récursif obtient la même valeur de n, qui n'atteint jamais 11) et qui mène à StackOverflowError.

Modifier à

recursivefun(n+1); 

ou

recursivefun(++n); 
1
recursivefun(n++); 

est un appel avec post-increment. Post-incrément est un mécanisme qui agrandit la valeur après sa lecture. Dans ce cas, vous passez toujours 1.

Vous pouvez utiliser pre-increment qui est ++n qui d'abord: incrémente puis transmet la valeur.

L'exception que vous obtenez est StackOverflowError, ce qui signifie que la pile est pleine et que la machine virtuelle Java ne peut pas stocker plus d'appels sur la pile, elle ne pourra donc pas être restaurée.

1
recursivefun(n++); 

Cette ligne signifie: appeler recursivefun(n); puis incrémenter n by 1 vous donc toujours appeler votre auj avec n=1 et a provoqué une Stackoverflow que

Vous avez donc besoin d'incrémenter n AVANT toute la fonction, vous avez quelques options:

recursivefun(n+1); 
//----------------------------- 
n++; 
recursivefun(n); 
//----------------------------- 
recursivefun(++n); //pre-cincrement 
0

En effet, les opérateurs post et pré-incrément incrémentent la valeur d'une variable. Leur comportement change en fonction du contexte d'utilisation. Supposons que le code ci-dessous:

boucle For 1: for (i = 0; i < 10; i ++) ...

boucle For 2: for (i = 0; i < 10; + + i) ...

Dans les deux déclarations ci-dessus, la boucle for itère 10 fois quel que soit le style d'incrément utilisé. Cependant considérez le code suivant:

int x = 10; 
int y = 20; 
int z = x++ + ++y; // z = 10 + 21 
System.out.println("x = " + x); // prints 11 
System.out.println("y = " + y); // prints 21 
System.out.println("z = " + z); // prints 31 

Par conséquent à partir de votre code, il est évident que recursivefun (n ++);

appels recursivefun avec l'argument 1 à l'infini. Pour éviter l'erreur StackOverFlow, utilisez soit ++ n ou n + 1.