【问题标题】:Java - Fibonacci NumbersJava - 斐波那契数列
【发布时间】:2018-04-11 01:52:24
【问题描述】:

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

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

例如,如果我要使用:

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

控制台打印出: 11 34 20

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

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

帮忙看看有什么问题

【问题讨论】:

  • 你的公式在我看来完全错误。我猜这是问题的根源。
  • 这是我大学给我的?
  • 你有没有问过教授为什么他们的 fib 公式与标准实现不同?

标签: java data-structures computer-science fibonacci


【解决方案1】:

您的代码很难阅读,实际上这使得调试非常困难。尝试采用更简单的方法。以下是查找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;

通过斐波那契数列,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);
}

【讨论】:

    【解决方案2】:

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

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

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

    虽然有更简单的函数可以找到Fibonacci sequence中的第n个数字。

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 2015-06-05
      • 2010-12-20
      • 2012-02-16
      • 1970-01-01
      • 2013-08-03
      • 2014-05-19
      相关资源
      最近更新 更多