2016-12-01 135 views
-1

下面的程序應該總結從n到0(負數)或從0到n(正數)的所有偶數。遞歸方法中的StackOverflowError

我不應該使用其他方法或*; * =

的問題是zaehler(counter) == eingabe(「eingabe的意思是‘在英文輸入’)後,該程序不會停止。我希望你能告訴我怎麼解決這個問題。

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); 
    } 
} 

回答

1

注與比你更少的代碼更簡單的方法是有一個單一的sum功能(而不是evenSum1evenSum2),即不斷遞歸直到counter等於targettarget - 1。然後,對於正數初始化counter0targeteingabe。對於負數,初始化爲countereingabetarget0。希望對你有意義!

如果您希望保持目前的方法,那麼您的代碼存在一些問題。我對它進行了修改並添加了必須修復的註釋。

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); 
    } 
}