2016-02-10 2 views
1

Я написал код для печати серии fibonacci, и я хочу сохранить его в динамическом массиве. Затем, когда пользователь вводит значение для печати определенного элемента массива, он должен отображать значение требуемого числа фибоначчи, хранящегося в массиве.Хранение фибоначчи в массиве и печать желаемого значения пользователя

package fibonacci; 

import java.util.Scanner; 

public class Fibonacci { 
    public static void main(String[] args){ 
     int size=new Scanner(System.in).nextInt(); 
     int fibonacci[]=new int[size]; 
     int i=3; 

     System.out.println("The number"); 

     int number=new Scanner(System.in).nextInt(); 
     for(int i1=1;i1<=number;i1++){ 

      System.out.println(fibonacci(i1)+" "); 

     } 
     int j=new Scanner(System.in).nextInt(); 
     System.out.println(fibonacci[i]); 

    } 




     public static int fibonacci(int number){ 
       if(number==1||number==2){ 
         return 1; 

        } 
        return fibonacci(number-1)+fibonacci(number-2); 

      } 
    } 
+1

Итак, в чем же вопрос? - http://stackoverflow.com/help/how-to-ask – radoh

ответ

1

вы можете воспользоваться массив и использовать его как этот

Фибоначчи [я] = Фибоначчи [я-1] + fibonnaci [я-2] это улучшит выполнение кода очень много, потому что рекурсивный функции могут иметь высокую сложность, вы бы не заметили различия в небольших значениях, но с большими значениями, например, фибоначчи [1000], вы заметите разницу, с которой вы можете заставить ваш процессор и память страдать и принести их на колени, поэтому я дам вам Fibonacci1, что ваша версия и Fibonacci2 проще версия:

Fibonacci1

import java.util.Scanner; 

    public class Fibonacci1 { 
     public static void main(String[] args) { 
      System.out 
        .println("enter the upper bound of the serie(Size of the array of fibonacci serie):"); 
      Scanner scanner = new Scanner(System.in); 
      int size = scanner.nextInt(); 
      int fibonacci[] = new int[size]; 

      for (int i = 0; i < size; i++) { 
       fibonacci[i] = fibonacci(i+1); 
      } 

      System.out.println("enter a number between 1 and " + size); 

      int j = scanner.nextInt(); 
      while (j < 0 || j > size) { 
       if (j < 0) { 
        System.out.println("j<0"); 
       } 
       if (j > size) { 
        System.out.println("j>" + size); 
       } 
       System.out.println("please enter a number between 1 and " + size); 
      } 

      System.out.println("Fibonacci[" + j + "]=" + fibonacci[j - 1]); 
      scanner.close(); 
     } 

     public static int fibonacci(int number) { 
      if (number == 1 || number == 2) { 
       return 1; 
      } 
      return fibonacci(number - 1) + fibonacci(number - 2); 

     } 
    } 

Fibonacci2:

пакет StackOverflow;

import java.util.Scanner; 

public class Fibonnaci { 
    public static void main(String[] args) { 
     System.out 
       .println("enter the upper bound of the serie(Size of the array of fibonacci serie):"); 
     Scanner scanner = new Scanner(System.in); 
     int size = scanner.nextInt(); 
     int fibonacci[] = new int[size]; 

     for (int i = 0; i < size; i++) { 
      fibonacci[i] = fibonacci(i + 1, fibonacci); 
     } 

     System.out.println("enter a number between 1 and " + size); 

     int j = scanner.nextInt(); 
     while (j < 0 || j > size) { 
      if (j < 0) { 
       System.out.println("j<0"); 
      } 
      if (j > size) { 
       System.out.println("j>" + size); 
      } 
      System.out.println("please enter a number between 1 and " + size); 
     } 
     System.out.println("Fibonacci[" + j + "]=" + fibonacci[j - 1]); 
     scanner.close(); 
    } 

    /* 
    * changed the fibonacci function in order to use the already calculated 
    * fibonacci elements 
    * fibSerie[n]=fibonnaci[n-1] 
    * fibSerie[n-1]=fibonnaci[n-2]; 
    * fibSerie[n-2]=fibonnaci[n-3]; 
    * because arrays start from 0 so fibSerie[1]=fibonnaci[0]; 
    */ 
    public static int fibonacci(int number, int[] fibonacci) { 
     if (number == 1 || number == 2) { 
      return 1; 
     } 
     return fibonacci[number - 2] + fibonacci[number - 3]; 

    } 
} 
+0

может у объяснить, почему в fibonacci1 у предоставили fibonacci (i) = fibonacci (i + 1)? –

+1

в основном потому, что массивы начинают индексировать в 0, поэтому в fibonnaciArray [0] мы храним файл-фибоначчи (1). так что в общем случае fibonacciArray [n-1] будет хранить fibonacciSerie (n) – achabahe

+0

Не понял точно вашу точку зрения. Но я постараюсь пройти через него снова. Спасибо –

2

Существует только около 94 значений Фибоначчи, которые подходят в long, так что вы можете создать их при запуске. Также использование цикла для создания чисел - O(n), однако использование рекурсии равно ответу, который является экспоненциальным. Вы быстро получаете числа, которые будут вычисляться дольше, чем возраст Вселенной.

+0

Сэр, вопрос, который я видел в Интернете, должен был решить с использованием самой рекурсии –

+0

@ManojKSharma Java не оптимизирует рекурсию в том, как некоторые другие языки, например. у него нет запоминания, поэтому вы используете итерацию (как это сделал принятый ответ), хотя использование простого цикла было бы намного чище. –

+0

Да, я согласен. Но вопрос, который я получил, был так. Благодарю вас, –