Хотя ваше решение может работать, оно довольно дорогое, поскольку пересчитывает уже полученные результаты.
Используя рекурсию в этом случае, чтобы иметь значение fibonacci(4)
, вы рекурсивно добавляете значения fibonacci(3)
и fibonacci(2)
, которые вы уже рассчитали ранее.
Попробуйте сохранить значения в списке, а не пересчитывать их постоянно:
List<Long> fibonacci = new ArrayList<Long>();
// First terms
fibonacci.add(-1L); // 0 is dummy, sequence starts at 1
fibonacci.add(1L);
fibonacci.add(2L);
for (int i = 3; fibonacci.get(i - 1) + fibonacci.get(i - 2) < 4000001; i++) {
long u = fibonacci.get(i - 1) + fibonacci.get(i - 2);
fibonacci.add(i, u);
}
Используя эту технику, вы можете вычислить последовательность Фибоначчи до 4000000 менее чем за 2 секунды (как я пытался на моем компьютере).
Затем просто добавьте некоторый код для вычисления суммы внутри цикла: -)