2016-12-01 1 views
-1

Le programme ci-dessous doit résumer tous les nombres pairs de n à 0 (négatif) ou de 0 à n (positif).StackOverflowError dans une méthode récursive

Je ne devrais pas utiliser d'autres méthodes ou *; * =

Le problème est que le programme ne se termine pas zaehler(counter) == eingabe ("EINGABE signifie « entrée » en anglais). J'espère que vous pouvez me dire comment résoudre le problème.

import javax.swing.JOptionPane; 

public class Toolbox { 
    public static int eingabe(int eingabe){ 
     if (eingabe < 0) { 
      evenSum1(eingabe, 0, 0); 
     } else { 
      evenSum2(eingabe, 0, 0); 
     } 

     return 0; 
    } 

    public static int evenSum2(int eingabe, int summe, int zaehler) { 
     if (PevenSum(eingabe, summe, zaehler) == 0) { 
      System.out.print("Die Summe aller geraden Zahlen ist: " + summe); 
      return 0; 
     } 

     zaehler = zaehler - 2; 
     summe = summe - zaehler; 
     evenSum2(eingabe, summe, zaehler); 
     return 1; 

    } 

    public static int evenSum1(int eingabe, int summe, int zaehler) { 
     if (NevenSum(eingabe, summe, zaehler) == 0){ 
      System.out.print("Die Summe aller geraden Zahlen ist: " + summe); 
      return 0; 
     } 

     zaehler = zaehler + 2; 
     summe = summe + zaehler; 
     evenSum1(eingabe, summe, zaehler); 
     return 1; 
    } 

    public static int NevenSum(int eingabe, int summe, int zaehler) { 
     if (zaehler == eingabe || zaehler == eingabe + 1) { 
      return 0; 
     } 

     return 1; 
    } 

    public static int PevenSum(int eingabe, int summe, int zaheler) { 
     if (summe == eingabe || summe == eingabe - 1) { 
      return 0; 
     } 

     return 1; 
    } 

    public static void main(String[] args) { 
     String eingabe; 
     eingabe = JOptionPane.showInputDialog("Hier eine Zahl eingaben"); 
     int zahl = Integer.parseInt(eingabe); 
     eingabe(zahl); 
    } 
} 

Répondre

1

Remarque qu'une approche plus simple avec beaucoup moins de code que vous avez est d'avoir une seule fonction sum (plutôt que d'avoir evenSum1 et evenSum2), qui ne cesse de récursion jusqu'à counter est égale à target ou target - 1. Ensuite, pour les nombres positifs initialize counter à 0 et target à eingabe. Pour les nombres négatifs, initialisez counter à eingabe et target à 0. J'espère que cela a du sens pour vous!

Si vous préférez conserver votre approche actuelle, votre code a rencontré quelques problèmes. J'ai fait des changements et ajouté des commentaires où les choses devaient être réparées.

import javax.swing.JOptionPane; 
public class TreeNode { 
    public static int eingabe(int eingabe) { 
     if (eingabe > 0) { // Needed to reverse this 
      evenSum1(eingabe, 0, 0); 
     } else { 
      evenSum2(eingabe, 0, 0); 
     } 

     return 0; 
    } 

    public static int evenSum2(int eingabe, int summe, int zaehler) { 
     if (PevenSum(eingabe, summe, zaehler) == 0) { 
      System.out.print("Die Summe aller geraden Zahlen ist: " + summe); 
      return 0; 
     } 
     zaehler = zaehler - 2; 
     summe = summe + zaehler; // Needed to change this to add rather than 
            // subtract (subtracting a negative number 
            // makes it positive) 
     evenSum2(eingabe, summe, zaehler); 
     return 1; 

    } 

    public static int evenSum1(int eingabe, int summe, int zaehler) { 
     if (NevenSum(eingabe, summe, zaehler) == 0) { 
      System.out.print("Die Summe aller geraden Zahlen ist: " + summe); 
      return 0; 
     } 
     zaehler = zaehler + 2; 
     summe = summe + zaehler; 
     evenSum1(eingabe, summe, zaehler); 
     return 1; 
    } 

    public static int NevenSum(int eingabe, int summe, int zaehler) { 
     if (zaehler == eingabe || zaehler == (eingabe - 1)) { // Changed from 
                   // zaehler == 
                   // (eingabe + 1) 
      return 0; 
     } 
     return 1; 
    } 

    public static int PevenSum(int eingabe, int summe, int zaheler) { 
     if (zaheler == eingabe || zaheler == eingabe + 1) { // Can't compare the 
                  // sum, have to 
                  // compare counter 
                  // and eingabe 
      return 0; 
     } 
     return 1; 
    } 

    public static void main(String[] args) { 
     String eingabe; 
     eingabe = JOptionPane.showInputDialog("Hier eine Zahl eingaben"); 
     int zahl = Integer.parseInt(eingabe); 
     eingabe(zahl); 
    } 
}