Search code examples
javastack-overflow

StackOverflowError in a recursive method


The program below should sum up all even numbers from n to 0 (negative) or from 0 to n (positive).

I should not use other methods or *; *=

The problem is that the program does not stop after zaehler(counter) == eingabe ("eingabe means "input" in English). I hope you can tell me how to solve the problem.

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

Solution

  • Note that a simpler approach with much less code than you have is to have a single sum function (rather than having evenSum1 and evenSum2), that keeps recursing until counter is equal to target or target - 1. Then, for positive numbers initialize counter to 0 and target to eingabe. For negative numbers initialize counter to eingabe and target to 0. Hope that makes sense to you!

    If you prefer to keep your current approach, there were a few issues with your code. I made changes to it and added comments where things had to be fixed.

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