0

Any idea why my code is giving out the wrong answer after the first few?

My university professor provided us with this to go by and I feel I followed it?

If for example I was to use:

System.out.println(fibr(8));
System.out.println(fibr(9));
System.out.println(fibr(10));

The console prints out: 11 34 20

Which of course is not the fibonacci numbers in those places

public static int fibr(int n) {
    if(n<0) return 0;
    if(n==0) return 0;
    if(n==1) return 1;
    if(n==2) return 1;

    //is odd
    // n is = or > 3 and NOT (n divided by 2 with remainder of 0 (making it even))
    if(n >= 3 && !(n % 2 == 0)) {
        int a;
        a = fibr((n+1)/2) * fibr((n+1)/2);
        a = a + (fibr((n-1)/2) * fibr((n-1)/2));
        return a;
    }

    //is even
    if(n >= 3 && (n % 2 == 0)) {
        int a;
        a = fibr((n/2)+1) + fibr((n/2)-1) * fibr(n/2);
        return a;
    }
    return 0;
}

Help what's wrong cri

3
  • 6
    Your formulas look completely wrong to me. My guess is this is the source of the problem. Commented Apr 11, 2018 at 1:53
  • That's what I was given by my university? Commented Apr 11, 2018 at 1:57
  • Did you ask the professor why their fib formula differs from standard implementations? Commented Apr 11, 2018 at 2:02

2 Answers 2

3

Your code is pretty difficult to read which, in practice, makes debugging very difficult. Try to take a simpler approach. Here is an example to find the n-th Fibonacci number:

double fibbonaci(int n){
    double prev = 0d, next = 1d, result = 0d;
    for (int i = 0; i < n; i++) {
        result = prev + next;
        prev = next;
        next = result;
    }
    return result;
} 

Additionally, there is a more elegant method to this problem which involves recursion:

int fibonacci(int n)  {
    if (n == 0)
        return 0;
    else if (n == 1)
        return 1;
    else
        return fibonacci(n - 1) + fibonacci(n - 2);
}


Edit: To fully answer your question, your error is in calculating even Fibonacci numbers. fib(8) = 21, fib(9) = 34, fib(10) = 55. For some unknown reason, you are calculating the n-th even Fibonacci number using:

int a;
a = fibr((n/2)+1) + fibr((n/2)-1) * fibr(n/2);
return a;

By the Fibonacci sequence, the n-th Fibonacci number is the sum of the previous two. So the above code can become:

return fibr(n - 1) + fibr(n - 2);

Therefore, your entire function can be reduced to:

public static int fibr(int n) {

    if (n <= 0) return 0;
    if (n == 1) return 1;
    if (n == 2) return 1;

    return fibr(n - 1) + fibr(n - 2);
}
Sign up to request clarification or add additional context in comments.

Comments

1

If your professor wants you to use the provided formula, then you should rewrite your code like this:

public class FibClass {

    // main
     public static void main(String[] args) {

      System.out.println(fibr(7)); // Returns 13

     }


    // Fibonacci function
     public static int fibr(int n) {

          if ( n < 0 ) {
            return 0; //returned value for negative integers
          } else if (n == 0) {
            return 0; //returned value for 0
          } else if (n == 1) {
            return 1; //1st number in the Fibonacci sequence
          } else if (n == 2) {
            return 1; //2nd number in the Fibonacci sequence
          }


          //is odd
          else if (n >= 3 && !(n % 2 == 0)) {

           int a;
           a = (int) Math.pow(fibr((n + 1) / 2), 2);
           a += (int) Math.pow(fibr((n - 1) / 2), 2);
           return a;

          }

          //is even
          else if (n >= 3 && (n % 2 == 0)) {

           int a;
           a = (fibr((n / 2) + 1) + fibr((n / 2) - 1)) * fibr(n / 2);
           return a;

          }

      return 0;

     } // END Fibonacci function fibr()


}

This is based on the formula you provided in the photo:

enter image description here

Although there are more simple functions to find the n-th number in the Fibonacci sequence.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.