打印出斐波那契数列

时间:2019-11-09 15:15:39

标签: java arrays recursion printing fibonacci

我正在尝试编写一个递归算法来计算斐波那契数。但是,该程序在打印结果方面很费力。

我的想法是将每个计算出的值存储到一个数组中(因此算法应该更快)。

我想要的输出:

The fibonacci of n = 1 is fn= 1    
The fibonacci of n = 2 is fn= 2    
The fibonacci of n = 3 is fn= 2    
The fibonacci of n = 4 is fn= 3
...
The fibonacci of n = 8 is fn= 21
public class fibonacciCalculator {

    static int[] arr = new int[50];

    static int fibo (int n, int arr[]) {
        if ( n == 0 ) {
            return 0; 
        }else if ( n == 1 ) {
            return 1; 
        } 
        if ( arr[n-1] == 0) {
            arr[n-1] = fibo(n-1, arr);  
        }
        if ( arr[n-2] == 0) {
            arr[n-2] = fibo(n-2, arr);
        }
        return arr[n-1] + arr[n - 2];
    } 

    public static void main(String[] args) {

        for (int i = 1; i == 8; i++) {
            if (arr [i] == 0) {
                fibo(i, arr);
                int x = arr[i];
                String a = String.format("The fibonacci of n = %d is fn= %d", i , x);
                System.out.println(a);
                }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您可以执行此操作而无需声明数组。这样,中间值存储在执行堆栈中:

public class fibonacciCalculator {

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

    public static void main(String[] args) {

        for (int i = 1; i <= 8; i++) {
            int x = fibo(i);;
            String a = String.format("The fibonacci of n = %d is fn= %d", i , x);
            System.out.println(a);
        }
    }
}

答案 1 :(得分:0)

这是一种方法。

   public int[] fib(int values[], int count) {
      if (count <= 0) {
         return values;
      }

      int k = values.length + 1;
      values = Arrays.copyOf(values, k);

      values[k - 1] = values[k - 2] + values[k - 3];
      return fib(values, count - 1);
   }

但是更好的方法是在创建值时memoize。这使您可以从最后计算的项开始计算,然后继续进行直到达到目标。如果您指定的值小于计算出的数字,则仅返回所请求的那些值。

使用了列表的防御性副本,因此您无法taint返回的子列表。

   List<Integer> fibs = new ArrayList(List.of(0, 1));
   public List<Integer> fib(int count) {
      int s = fibs.size();
      if (count < s) {
         // return a defensive copy to protect cached values.
         return new ArrayList<>(fibs.subList(0, count));
      }
      int e = fibs.get(s - 1) + fibs.get(s - 2);
      fibs.add(e);
      return fib(count);
   }

答案 2 :(得分:0)

好了,我将发布工作代码。 也许会对其他人有帮助。

public class fibonacciCalculator {
    static int[] arr = new int[48];
    static int fibo (int n, int arr[]) {
        if ( n == 1|| n == 2 ) {
            return 1; 
        }else if ( n == 0 ) {
            return 0; 
        }
        if (arr[n-1] == 0) {
            arr[n-1] = fibo(n-1, arr);
        }
        if (arr[n-2] == 0) {
            arr[n-2] = fibo(n-2, arr);
        }
        return arr[n-1] + arr[n - 2];
    }   
    public static void main(String[] args) {

        for (int i = 1; i <= arr.length-1; i++) {
            if (arr [i] == 0) {
                arr[i] = fibo(i, arr);
                System.out.print("The Fibonacci number " + i);
                System.out.println(" is: " + arr[i]);
            }       
        }
    }
}

但是... int将超出其在Fibonacci 48处的限制。如果希望更高的值,应将int替换为long。 但在那之后不知道..:D 问候Synix