Java - 斐波纳契数

时间:2018-04-11 01:52:24

标签: java data-structures computer-science fibonacci

我知道为什么我的代码在前几个代码之后会给出错误的答案?

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

例如,如果我要使用:

test1.o

控制台打印出来: 11 34 20

当然不是那些地方的斐波那契数字

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

帮助犯了什么错误

2 个答案:

答案 0 :(得分:3)

您的代码很难阅读,实际上,这使得调试变得非常困难。尝试采用更简单的方法。以下是查找n-th斐波纳契数的示例:

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

此外,这个问题有一个更优雅的方法,涉及递归:

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


修改 为了完全回答你的问题,你的错误在于计算甚至斐波纳契数。 fib(8) = 21, fib(9) = 34, fib(10) = 55。 由于某些未知原因,您使用以下方法计算n-th偶数斐波纳契数:

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

通过Fibonacci序列,n-th斐波那契数是前两个的总和。所以上面的代码可以变成:

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

因此,您的整个功能可以简化为:

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

答案 1 :(得分:1)

如果您的教授希望您使用提供的公式,那么您应该像这样重写您的代码:

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()


}

这是基于您在照片中提供的公式:

enter image description here

虽然有更简单的功能可以在Fibonacci sequence找到第n个数字。