Negafibonacci Folge berechnen

SnowDragon

Mitglied
Hallo, Ich muss die folgende Aufgabe lösen:
vervollständigen Sie die Methode solve() der Klasse Negafibonacci derart, dass sie für die als Parameter übergebene ganze Zahl n das n-te Glied der Folge zurückgibt.
Das ist meine Methode:
Code:
public static int solve(int n) {
        // Don't delete!! Tests will fail otherwise
        // Pass object r to other function calls of solve (e.g. for recursion). Do not create other instances of object r
        // Function solve(...) must be recursive, don't implement other recursive helper functions
        //r.check();

        // TODO
        if (n>=0){
           if(n == 0) {
                 return 0;
               } else if (n == 1) {
                 return 1;
               } else {
                  //System.out.println(solve(n-1) + solve(n-2));
                  return solve(n-1) + solve(n-2); //der rekursive Aufruf
               }}
        else{
            if(n == 0) {
                 return 0;
               } else if (n == -1) {
                 return 1;
               } else {
                   if (n%2==0){
                  //System.out.println(solve(n-1) + solve(n-2));
                  return solve(n+1) + solve(n+2);}
                   else{
                       return (solve(n+1) + solve(n+2)); //der rekursive Aufruf
                   }
               }}
        }
Die Methode funktioniert für alle Zahlen, außer negative gerade Zahlen. Bei n=-4 kommt z.B 3 raus statt -3. Das heißt, ich muss den ergebniswert bei negativen geraden Zahlen invertieren, aber wie?
 
Ich weiss nicht ob es daran liegt aber du fragst oben ab:
if (n>=0) {
....
} else if (n==0) {
...
}
In den unteren Teil kommt er nie rein ! Also in dieses return 0;

Deine Formatierung macht einen ja krank ....
 
wozu ist diese Unterscheidung gut wenn du eh das selbe machst :
Code:
                if (n % 2 == 0) {
                    //System.out.println(solve(n-1) + solve(n-2));
                    return solve(n + 1) + solve(n + 2);
                } else {
                    return (solve(n + 1) + solve(n + 2)); //der rekursive Aufruf
                }
 
Code:
        else{
            if(n == 0) {
                 return 0;  <-------  hier wirst du nie hinkommen
               } else if (n == -1) {
                 return 1;
               } else {
 
wozu ist diese Unterscheidung gut wenn du eh das selbe machst :
Code:
                if (n % 2 == 0) {
                    //System.out.println(solve(n-1) + solve(n-2));
                    return solve(n + 1) + solve(n + 2);   <-- hier muss ich was ändern, denke ich. Und zwar so, dass, falls n = -4 nicht wie momentan der fall 3 rauskommt, sondern -3, so wie die negafibonacci Folge definiert ist.
                } else {
                    return (solve(n + 1) + solve(n + 2)); //der rekursive Aufruf
                }
 
So sollte es eigentlich aussehen:
n=-8 -> -21 bei mir: 21
n=-7 -> 13
n=-6 -> -8 bei mir: 8
n=-5 -> 5
n=-4 -> -3 bei mir: 3
n=-3 -> 2
n=-2 -> -1 bei mir: 2
n=-1 -> 1
n=0 -> 0
n=1 -> 1
n=2 -> 1
n=3 -> 2
n=4 -> 3
n=5 -> 5
n=6 -> 8
n=7 -> 13
n=8 -> 21
 
Also ich kann dir jetzt nicht sagen wo bei dir der Fehler liegt der Code ist ein bisschen verworren 😉
Das funktioniert:

Java:
private static int fiboRec(int n) {
        if (n == 0){
            return 0;
        }else if (n == 1){
            return n;
        }else if (n == -1){
            return n;
        } else if (n > 1){
            return fiboRec(n - 2) + fiboRec(n - 1);
        }else {
            return  fiboRec(n + 2) + fiboRec(n + 1);
        }
    }
Viel Spass damit
 
@JStein52 Danke! Hätt ich eigentlich selber gucken können
Java:
 private static int fiboRec(int n) {
        if (n == 0) {
            return 0;
        } else if (n == 1) {
            return n;
        } else if (n < 0) {
            return (int)Math.pow(-1,n+1)*fiboRec(-n);
        }
        else {
            return fiboRec(n - 2) + fiboRec(n - 1);
        }
}

Jetzt machts das was es soll
 
Wieso nicht einfach so:
Java:
    public static int solve(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == +1) {
            return 1;
        }
        if (n < 0) {
            return (n % 2 == 0 ? -1 : +1) * solve(-n);
        }
        return solve(n - 1) + solve(n - 2);
    }

Spart ein read, ein if und das lästige .pow() ...
 
... die Fallunterscheidung kommt ganz ohne Rechnen aus. 🙂
Code:
... 
return ((n & 1) == 0 ? -solve(-n) : solve(-n));
 

Zurück
Oben