【问题标题】:Fibonacci Iterative Move In Array[]数组中的斐波那契迭代移动[]
【发布时间】:2020-02-02 11:33:05
【问题描述】:

我的目标是编写一个显示斐波那契数列如何移动的方法。我必须使用数组和方程式来显示数字在数组上的移动方式(因此使用斐波那契方法迭代值:前一个数字 + 当前数字 = 下一个数字)。

这是我想用 array[] 作为表示的逻辑:

    n = fibonacci number
    i = 1;
    previousNumber = 0 
    nextNumber = 1 
    sum = previousNumber + nextNumber;
    while (i <= n) {
    sum = previousNumber + nextNumber;
    previousNumber = nextNumber;
    nextNumber = sum;

return nextNumber;

我走了这么远,我被困住了:

long fibonacci(int fibonacci) {
    int[] fib = new int[20];
    if (fibonacci < 0) {
        throw new IllegalArgumentException("n value cannot be negative number");
    }
    if (fibonacci == 0 || fibonacci == 1) {
        return 1;
    }
    fib[0] = 1;
    fib[1] = 1;
    int i ;
    for (i = 2; i < fibonacci; i++) {
        fib[i] = fib[0] + fib[1];
        fib[0] = fib[1];
        fib[1] = fib[i]; 
    }
    return fib[i];
}

返回的值似乎没问题。在斐波那契测试中,来自 5 的 fib 是 5,而 4 是 3。让我担心的是这个字符串在调试器上的样子。我移动它们的方式使它们看起来像这样:{3,5,2,3,5},它应该是 {1,1,2,3,5}。

【问题讨论】:

    标签: java arrays do-while fibonacci


    【解决方案1】:

    你不需要数组。

    long fibonacci(int fibonacci) {
        if (fibonacci < 0) {
            throw new IllegalArgumentException("n value cannot be negative number");
        }
        if (fibonacci == 0 || fibonacci == 1) {
            return 1;
        }
        first = 1;
        second = 1;
        sum i;
        for (i = 2; i <= fibonacci; i++) {
            sum = first + second;
            first  = second;
            second = sum; 
        }
       return sum;
    }
    

    这个实现更简单,更易读。

    【讨论】:

      【解决方案2】:

      你的循环是错误的。应该是:

      for (i = 2; i <= fibonacci; i++) {
          fib[i] = fib[i-1] + fib[i-2];
      }
      return fib[i-1];
      

      你不应该改变fib[0]fib[1]fib[i]应该是前两个元素的总和。

      如果目标是在没有数组的情况下计算 fib(i),则需要两个变量来跟踪最后两个值:

      long fibonacci(int fibonacci) {
          if (fibonacci < 0) {
              throw new IllegalArgumentException("n value cannot be negative number");
          }
          if (fibonacci == 0 || fibonacci == 1) {
              return 1;
          }
          int beforeLast = 1;
          int last = 1;
          int i;
          int fib = 1;
          for (i = 2; i <= fibonacci; i++) {
              fib = last + beforeLast;
              beforeLast = last;
              last = fib;
          }
          return fib;
      }
      

      【讨论】:

        【解决方案3】:

        你的方法应该是这样的:

        static long fibonacci(int fibonacci) {
                int[] fib = new int[20];
                if (fibonacci < 0) {
                    throw new IllegalArgumentException("n value cannot be negative number");
                }
                if (fibonacci == 0 || fibonacci == 1) {
                    return 1;
                }
                fib[0] = 1;
                fib[1] = 1;
                int i;
                for (i = 2; i < fibonacci; i++) {
                    fib[i] = fib[i - 1] + fib[i - 2]; // change here
                }
                return fib[i-1]; // change here
            }
        

        【讨论】:

        • 嗨 Piotr,我忘了提,但我不能对这个使用递归。
        • 嗨,Jakub,这不是递归 - 它只是返回数组的最后一个计算元素 - 就像你做的那样 :)
        猜你喜欢
        • 2016-02-19
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        相关资源
        最近更新 更多