2014-10-19 2 views
0

// Я узнал о рекурсии в Java. /** Я пытаюсь вычислить 45-е число Фибоначчи, используя массив, чтобы сократить время, которое не работает хорошо ... сообщение об ошибке: Исключение в потоке «main» java.lang.ArrayIndexOutOfBoundsException: 45 в Auf1.fib2 (Auf1.java:25) в Auf1.main (Auf1.java:49) **/Расчет числа Фибоначчи с массивом

public class Auf1 { 

    public static long[] feld; 

     public static long fib2(long n) { 
      if ((n == 1) || (n == 2)) { 
       return 1; 
      } else { 
       if (feld[(int) n] != -1) { 
        return feld[(int) n]; 
       } else { 
        long result = fibo(n - 1) + fibo(n - 2); 
        feld[(int) n] = result; 
        return result; 
       } 
      } 
     } 

public static void main(String[] args) { 
    long n = 45; 
    feld = new long[(int) n]; 
     for (int i = 0; i < n; i++) { 
      feld[i] = -1; 
     } 
     long result = fib2(n); 
     System.out.println("Result: " + result); 
    } 
} 
+0

Сделать массив один элемент больше: 'Feld = новый длинный [(целое) п + 1];' (допустимые индексы от 0 до длины-1) – Henry

+0

ли Вы должны использовать массив? Нужно ли хранить предыдущие вычисления последовательности фибоначчи? –

+0

Конечно, итеративный способ намного быстрее, но его хорошая практика, чтобы войти в контакт с динамическим программированием. – user

ответ

1

индексы массива начинается с 0. создается массив размером 45 Допустимые индексы массива: 0,1 ... 44. При первом вызове fib2 ваш чек, если массив [45] равен -1. array [45] не является допустимым индексом и приведет к исключению IndexOutOfBoundException.

изменить следующие строки:

(feld[(int) n] != -1) 

к

(feld[(int) n - 1] != -1) 

и линию

feld[(int) n] = result 

к

feld[(int) n - 1] = result; 

BTW Ошибка синтаксиса. Рекурсивный вызов должен быть fib2(n-1) + fib2(n-2) и не fibo(n-1) + fibo(n-2)

+0

Это сработало. Спасибо! – Aabbccc

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