2013-03-16 3 views
0

Я изучаю Java и практикую массивы. Я решил создать серию Фибоначчи в качестве эксперимента и не могу не думать, что может быть более простой способ генерировать серию (используя массив и цикл).Есть ли более элегантный способ отображения серии Фибоначчи, чем это?

Любые мысли?

//Generate a Fibonacci series 
public class Array { 

    public static void main(String[] args) { 
     // An array to store the values 
     int[] intArray = new int[20]; 

     // starting values for the sequence 
     intArray[0] = 0; 
     intArray[1] = 1; 

     //display the first values 
     System.out.println("array["+(0)+"] = "+intArray[0]); 
     System.out.println("array["+(1)+"] = "+intArray[1]); 

     //generate the fibonnacci progression with a loop 
     for (int count=2;count<intArray.length;count++){ 
     intArray[count] = intArray[(count-1)]+intArray[(count-2)]; 
     System.out.println("array["+(count)+"] = "+intArray[count]); 
    } 
} 

ответ

0

Я бы сказал так, как вы сделали это самый элегантный и эффективный способ решения этой проблемы, если вы хотите сохранить все значения в массиве. Однако сохранение значений не требуется.

На эстетической стороне примечание, круглые скобки вокруг вашей переменной count и числа 0 и 1 не нужны, и сделать код довольно грязным для чтения.

1

Вы должны искать рекурсивный ответ, их много на этом сайте. Например. fibonacci series - recursive summation

+1

Я всегда, хотя Фибоначчи был отличный пример, когда не использовать рекурсивное решение. Потому что единственные числа, которые в итоге суммируются, составляют 1 с в хвосте рекурсии, и поэтому время для запуска пропорционально результату. – devconsole

+0

Нет ничего плохого в решении динамического программирования. – Makoto

+0

Нет ничего плохого в простых итеративных решениях, но рекурсивные решения элегантны, неэффективны, но вопрос был изящным. –

1

Вот решение без решетки - только 4 int s используется.

public class Fibonacci 
{ 
    public static void main(String[] args) 
    { 
     int first = 0; 
     int second = 1; 
     int sum; 
     for (int i = 0; i < 20; i++) 
     { 
     sum = first + second; 
     System.out.println("iteration " + i + ": " + sum); 
     first = second; 
     second = sum; 
     } 
    } 
} 

Выход:

iteration 0: 1 
iteration 1: 2 
iteration 2: 3 
iteration 3: 5 
iteration 4: 8 
iteration 5: 13 
iteration 6: 21 
iteration 7: 34 
iteration 8: 55 
iteration 9: 89 
iteration 10: 144 
iteration 11: 233 
iteration 12: 377 
iteration 13: 610 
iteration 14: 987 
iteration 15: 1597 
iteration 16: 2584 
iteration 17: 4181 
iteration 18: 6765 
iteration 19: 10946 
0

Это самый короткий я мог бы сделать:

public static void main(String[] args) { 
    int a = 0, b = 1; 
    long length = 20; 
    System.out.println(a); 
    System.out.println(b); 
    while (--length >= 0) 
     System.out.println((a = (b = a + b) - a) * 0 + b); 
} 

Дает:

0 1 1 2 3 5 8 13 ...

0

Ever протестировали решение, как этот? Он использует Формулу Мовре-Бине. С длинным типом я получаю ошибку точности при п> 71.

public static void main(String[] args) { 
    for (int i = 0; i < 20; i++) { 
     System.out.println(getFibonacci(i)); 
    } 
} 

private static int getFibonacci(int n) { 
    return (int) ((1D/Math.sqrt(5D)) * ((Math.pow(((1D + Math.sqrt(5D))/2D), n)) - Math.pow(((1D - Math.sqrt(5D))/2D), n))); 
} 

Чем выше п медленнее или памяти голодной наивные или рекурсивные алгоритмы. Следующий рекурсивный пример работает для меня до n = 14832. Возможно, я буду ждать моих текущих настроек JVM.

static final Map<Integer,BigInteger> FIBONACCI_RESULTS = new HashMap<>(); 


private static BigInteger getFibonacciRecursive(final int n) { 
    return ((n == 1) || (n == 2)) ? BigInteger.ONE : fetchResult(n); 
} 

private static BigInteger fetchResult(final int n) { 
    BigInteger result; 
    System.out.println("n := "+n); 
    if (FIBONACCI_RESULTS.containsKey(n)) { 
     result = FIBONACCI_RESULTS.get(n); 
    } else { 
     result = getFibonacciRecursive(n - 1).add(getFibonacciRecursive(n - 2)); 
     FIBONACCI_RESULTS.put(n, result); 
    } 
    return result; 
} 
0

Самый элегантный и хорошо структурированная программа для создания ряда Фибоначчи, которые я мог бы сделать это:

import java.util.Scanner; 

public class fibon{ 

    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     System.out.println("How many times shall we generate the fibonacci series?"); 
     int max = scan.nextInt(); 
     scan.close(); 
     fibgen(max); 
    } 
    public static void fibgen(int max) { 
     int f = 0, s = 1; 
     for(int i = 0; i <= max; i++) { 
      f += s; 
      s = f - s; 
      System.out.println(s + " "); 
     } 

    } 
} 
Смежные вопросы