Stack Overflow - Rekursive Fibonacci

Tim Kröger

Mitglied
Moin Leute,

ich arbeite derzeit an einer Aufgabe, in der ich die Fibunacci-Folge rekursiv berechnen muss.
Mein Problem dabei ist, dass ich immer einen Stack Overflow bekomme.

Interessant wird dabei die if-abfrage (i<n):
Java:
    public static void main(String[] args) {
        int n; 
        int summand1 = 1,summand2 = 1;
      
        java.util.Scanner input = new java.util.Scanner(System.in);
        System.out.printf("Bis zu welchem Element soll die Fibunacci Folge berechnet werden?");
        n = input.nextInt();
      
        fibunacci(n,summand1,summand2);
        }
  
    public static int fibunacci (int n, int summand1, int summand2) {
        int ergebnis;
        int r_tiefe = 0,i = 0,m;
        m = n - 1;
        i++;
 
        if (n == 1) {
            ergebnis = summand1;

            System.out.printf("n%d: %d Ergebnis: %d Rekursionstiefe: %d",n,summand1,ergebnis,r_tiefe);

            return(1);
        }
        if (n == 2) {
            ergebnis = summand1 + summand2;

            System.out.printf("n%d: %d n%d: %d Ergebnis: %d Rekursionstiefe: %d",m,summand1, n,summand2,ergebnis,r_tiefe);

            return(1);
        }
        if (i < n) {
            ergebnis = summand1 + summand2;

            System.out.printf("n%d: %d n%d: %d Ergebnis: %d Rekursionstiefe: %d Funktionsaufrufe: %d",m,summand1, n,summand2,ergebnis,r_tiefe,i);

            r_tiefe++;
            summand1 = summand2;
            summand2 = ergebnis;
            fibunacci(n,summand1,summand2);
        }

        else {
        return(-1);
        }

        return(1);
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Moin,

bitte nutze die Java-Tags ... so bekomt man ja Augenkrebs 😱

Sodann: in welcher Zeile kommt denn der Fehler?
Poste am besten den kompletten Stacktrace !

Gruß Klaus
 
Moin,

der Fehler tritt auf bei:

Bis zu welchem Element soll die Fibunacci Folge berechnet werden? 3
Code:
Exception in thread "main" java.lang.StackOverflowError
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3797)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4227)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
    at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
    at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
    at java.util.regex.Pattern$Branch.match(Pattern.java:4602)
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
    at java.util.regex.Pattern$Start.match(Pattern.java:3461)
    at java.util.regex.Matcher.search(Matcher.java:1248)
    at java.util.regex.Matcher.find(Matcher.java:664)
    at java.util.Formatter.parse(Formatter.java:2549)
    at java.util.Formatter.format(Formatter.java:2501)
    at java.io.PrintStream.format(PrintStream.java:970)
    at java.io.PrintStream.printf(PrintStream.java:871)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:55)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
    at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:59)
 
Zuletzt bearbeitet von einem Moderator:
hmm ...
Also wohl hier "at aud_aufgabe2_1.pkg2.AuD_Aufgabe2_12.fibunacci(AuD_Aufgabe2_12.java:55)", welche Zeile auch immer das ist ... 😕

Gruß Klaus
 
Gerade gemerkt - sorry 😀

Java:
 if(i < n){
            ergebnis = summand1 + summand2;

           out.printf("n%d: %d n%d: %d Ergebnis: %d Rekursionstiefe: %d Funktionsaufrufe: %d",m,summand1, n,summand2,ergebnis,r_tiefe,i);

            r_tiefe++;
            summand1 = summand2;
            summand2 = ergebnis;
            fibunacci(n,summand1,summand2);
       }



Zeile 55: out.printf("n%d: %d n%d: %d Ergebnis: %d Rekursionstiefe: %d Funktionsaufrufe: %d",m,summand1, n,summand2,ergebnis,r_tiefe,i);

Zeile 59: fibunacci(n,summand1,summand2);
 
Zuletzt bearbeitet:
Mal ganz davon abgesehen, dass deine Rekursionstiefe immer 0 sein wird, ist es klar das das nicht geht, wenn du die Methode immer wieder mit dem gleichen i und n aufrufst. Dann läuft sie halt endlos.
 
Ja... den muss ich machen - dass das mit der RTiefe auch noch nicht läuft wusste ich - mein Fehler. 🙂

Was das i und das n angeht:
das n wird im main vom Nutzer eingegeben (Übergabeparameter) und i wird in der methode fibunacci mit 0 initialisiert und inkrementell erhöht. Die beiden sind nicht immer gleich oder?

Gruß
Tim Kröger
 
Warum suchst du dir nicht eine saubere Implementierung im Netz? Das wurde wirklich schon zig mal gelöst und erweiterst dann diese?

PS: Der Herr hieß Fibonacci nicht Fibunacci
 

Zurück
Oben