Methoden Fibonacci in Array mit rekursiver Methoden

karl_patrick

Mitglied
Hallo!

An der Uni habe ich gerade mit einem Grundkurs zur Java Programmierung begonnen und komme nun an einer Stelle nicht weiter. Ich soll ein Programm schreiben, welches mit Hilfe einer rekursiven Methode die Stellen der Fibonacci Folge (von 3-10; also im Array der Position 2-9) berechnet und in ein Array schreibt. Ich scheitere allerdings an dem Versuch die Methode fib rekursiv zu schreiben, da sie ja zwei Rückgabewerte erwartet (einen Array und einen Int). Vielleicht kann mir hier jemand helfen? Hier mein derzeitiger Code:

Java:
class Fibonacci{

    //Berechnung, Speicherung und Ausgabe der Fibonacci-Folge 
    //mit Methoden und Arrays

    public static void main(String[] args){

        int[] startArray = {1,1,0,0,0,0,0,0,0,0};
       
        int[] resultArray = fib(startArray, 2);
       
        printFibArray(resultArray);

    }


    public static int[] fib(int[] array, int pos){

        // Ab hier darf der Code verändert werden.
       
        if (pos==0 || pos==1){
            return resultArray[pos]=1;
        }
        else if (pos<startArray.length){
            resultArray[pos]=(pos-1)+(pos-2);
            return fib (startArray[], pos++);
        }
    }
   
    // Ausgabe der Fibonacci-Folge
    public static int printFibArray(int[] array2){

        for (int i=0; i<resultArray.length;i++){
        System.out.println(resultArray[i]);

        }   
    }
}

Vielen Dank im Voraus!

Patrick
 
Ich scheitere allerdings an dem Versuch die Methode fib rekursiv zu schreiben, da sie ja zwei Rückgabewerte erwartet (einen Array und einen Int). Vielleicht kann mir hier jemand helfen?
Warum werden 2 Rückgabewerte erwartet? Das Array ist klar, aber welcher int-Wert?

Laut deinem Code sind die Werte für Index 0 bzw Index 1 schon gesetzt, außerdem erhöhst du beim rekursiven Aufruf pos um 1. Wie sollte "pos" also jemals auf 0 oder 1 kommen?

Java:
public static int[] fib(int[] array, int pos) {
   // Ab hier darf der Code verändert werden.
   if (pos < startArray.length) {
     resultArray[pos] = (pos - 1) + (pos - 2); // diese berechnung ist falsch
     return fib (startArray[], pos++);
   } else {
     // Was soll hier passieren????
   }
}
 
Hallo Joose, danke für deine Antwort. In der Tat habe ich die 0 und 1 nur benutzt, da wir vorher ein Beispiel hatten, bei der die pos Variable in die Konsole eingegeben wurde.

Ich habe mir das jetzt nochmal angeschaut und folgenden Ansatz:

Java:
public static int[] fib(int[] array, int pos){

        // Ab hier darf der Code verändert werden.
        array[0] = startArray[0];
        array[1] = startArray[1];
   
        if (pos<(startArray.length-1)){
            array[pos]=((pos-1)+(pos-2));
            fib(array, pos+1);
        }
        else {
            return array[pos]=((pos-1)+(pos-2));
        }
    }

Leider sagt mir hier der Compiler, dass er meine beiden Arrays nicht findet, obwohl diese ja in der selben Klasse gespeichert sind. Ich bin mir zudem bei zwei Punkten unsicher:
1) Muss ich die ersten beiden Einträge ins array schreiben oder werden die automatisch ins resultArray übertragen
2) Muss ich die Ausgaben der Methode in das resultArray schreiben oder in das startArray, weil die automatisch übertragen werden

Vielen Dank und Liebe Grüße
 
Moin,

erstens ist "startArray" (zumindest lt. deines Codesausschnittes) nicht bekannt!
Und zweitens: warum versuchst Du, die ersten beiden Stellen des übergebenen Arrays zu überschreiben ??
Drittens: welcher Fehler kommt wo genau ??

Gruß Klaus
 
Hallo Klaus, ich habe jetzt nur die Methode aus der Klasse in meiner Anfangsfragestellung überarbeitet (und gepostet), aber in der Klasse sind die beiden deklariert und startArray doch initialisiert worden.

Sind alle Einträge durch die Übergabe automatisch im array - Array gespeichert? Dann kann ich mir die beiden Zeilen tatsächlich sparen..

Fehler kommen folgende:

Code:
Fibonacci.java:20: error: cannot find symbol
        array[0] = startArray[0];
                   ^
  symbol:   variable startArray
  location: class Fibonacci
Fibonacci.java:21: error: cannot find symbol
        array[1] = startArray[1];
                   ^
  symbol:   variable startArray
  location: class Fibonacci
Fibonacci.java:23: error: cannot find symbol
        if (pos<(startArray.length-1)){
                 ^
  symbol:   variable startArray
  location: class Fibonacci
Fibonacci.java:28: error: incompatible types: int cannot be converted to int[]
            return array[pos]=((pos-1)+(pos-2));
                             ^
 
Danke für deine Bemühungen!

Aber irgendwie habe ich das Gefühl, wir reden aneinander vorbei.. 😕

Das Array mit dem Namen "array" existiert doch nur innerhalb meiner Methode "fib" und bekommt doch erst mit dem Methodenaufruf Werte übergeben. So wie ich das verstehe sind das die Werte vom "startArray" durch diese Codezeile:
Java:
int[] resultArray = fib(startArray, 2);
Somit brauche ich -nach meinem Verständnis- in der tat nicht mehr die ersten beiden Stellen überschreiben. Jetzt sollen doch in meiner Methode "fib" alle Werte in "array" gespeichert und dann nach "resultArray" kopiert werden. Zum Verständnis hier noch einmal mein (überarbeiteter) kompletter Code:

Java:
class Fibonacci{

    //Berechnung, Speicherung und Ausgabe der Fibonacci-Folge
    //mit Methoden und Arrays

    public static void main(String[] args){

        int[] startArray = {1,1,0,0,0,0,0,0,0,0};
     
        int[] resultArray = fib(startArray, 2);
     
        printFibArray(resultArray);

    }


    public static int[] fib(int[] array, int pos){

        // Ab hier darf der Code verändert werden.
        if (pos<startArray.length){
            array[pos]=((pos-1)+(pos-2));
            fib(array, pos+1);
        }
        else {
            return array;
        }
    }
 
    // Ausgabe der Fibonacci-Folge
    public static int printFibArray(int[] array2){

        for (int i=0; i<resultArray.length;i++){
        System.out.println(resultArray[i]);

        } 
    }
}

Doch es kommen noch immer folgende Fehlermeldungen:

Code:
Fibonacci.java:20: error: cannot find symbol
        if (pos<startArray.length){
                ^
  symbol:   variable startArray
  location: class Fibonacci
Fibonacci.java:32: error: cannot find symbol
        for (int i=0; i<resultArray.length;i++){
                        ^
  symbol:   variable resultArray
  location: class Fibonacci
Fibonacci.java:33: error: cannot find symbol
        System.out.println(resultArray[i]);
                           ^
  symbol:   variable resultArray
  location: class Fibonacci
Liebe Grüße
 
Zum Fehler: in der Methode fib() ist startArray nicht definiert, der Methode ist bisher nur das übergebene Array Namens array bekannt.

Dann das Thema "rekursiv", ich zweifle, dass ihr das vorgebenes Problem rekusiv lösen sollt. In der Vorgabe steht nichts von Rekusiv. Ich denke eher, ihr sollt das Array schrittweise auffüllen in der Art
Code:
array[i] = array[i-1]+array[i-2]
mit i = 2 ... 9 😉
 
startArray und resultArray sind ja nur in der Methode main bekannt. Also hat der Compiler erst mal recht.
Also schreibst du
Code:
if (pos<array.length){
 
Bei dem rekursiven Ansatz bin ich mir sehr sicher s.u.

Hier die Aufgabenstellung:

Implementieren Sie die Java Methode fib, welches die ersten 10 Glieder (n=1...10) der unten stehenden Fibo- naccifolge berechnet. Verwenden Sie dazu rekursive Methodenaufrufe!
Die Funktion fib soll den entsprechenden Wert für die Stelle pos berechnen, in das Array schreiben und sich dann selbst mit inkrementierter Position aufrufen. Achten Sie auf die Rückgabewerte und Abbruchbedinungen! Erstellen sie kein neues Array sondern arbeiten Sie auf dem übergebenen Parameter! Der Methodenaufruf soll alle Nullen durch die berechneten Werte ersetzen.
 
Deine Klasse sollte Public sein.
Die Ausgabe Methode printFibArray() hat keinen Rückgabewert benutze "void".
Die Rekursion wird durch return fib(...); erreicht, im Abbruchfall nur return array;
Achte auf den Arraynamen.
 
Danke JStein52!
Logisch, dass die die Arrays in der Main Methode den selben Regeln folgen, wie in anderen Methoden - da habe ich nicht richtig nachgedacht. Somit löst deine Hilfe auch (fast) alle Probleme.

Mein Compiler gibt mir am Ende von den beiden Methoden (nicht main) die Fehlermeldung, dass ein return Wert fehlt:
Code:
Fibonacci.java:27: error: missing return statement
    }
    ^
Fibonacci.java:36: error: missing return statement
    }
    ^
2 errors
Bei der ersten löse ich das Problem, indem ich den "else" Teil entferne und direkt "return array;" verwende. Aber beim zweiten erwartet die Methode als Ausgabe ein Integer!?
 
Oh Hallo Mariane, ja danke, zu dem ersten bin ich auch schon gekommen. Und auch bei dem zweiten, war dies mein Ansatz. Ich dachte jedoch, dass mir dieser Methodenkopf auch gegeben wurde - nach erneutem nachsehen ist dem aber nicht so -> ich kann void benutzen -> Probleme gelöst!

Herzlichen Dank allen freundlichen Helfern!!
 
Die Anforderungen sind ungenau, und wenn array und pos übergeben werden, dann ist es einfach nur eine in rekursiv umgewandelte Schleife / rekursive Schleife.

Sag deinem Prof., die Aufgabenstellung ist ungenau, du wirst diese Aufgabe nicht bearbeiten. (Optimalerweise formulierst du das noch in sehr freundlich)

Ich habe schon drei mögliche Lösungen, wobei das alles Bad/Terrible code ist.^^
 

Zurück
Oben