递归方法中的 StackOverflowError

StackOverflowError in a recursive method

下面的程序应该对从 n 到 0(负)或从 0 到 n(正)的所有偶数求和。

我不应该使用其他方法或 *; *=

问题是程序在zaehler(counter) == eingabe("eingabe means "input"英文)后没有停止。希望您能告诉我如何解决这个问题。

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

请注意,一种比现有代码少得多的更简单方法是使用单个 sum 函数(而不是使用 evenSum1evenSum2),它会一直递归直到 counter 等于 targettarget - 1。然后,对于正数,将 counter 初始化为 0,将 target 初始化为 eingabe。对于负数,将 counter 初始化为 eingabe,将 target 初始化为 0。希望这对你有意义!

如果您希望保留当前的方法,那么您的代码存在一些问题。我对其进行了更改,并在必须修复的地方添加了注释。

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