Даже с учетом предложенных улучшений @Jason, это все еще алгоритм с экспоненциальным временем сложностью O (2 ^ N).
Чтобы уменьшить сложность времени до O (N ), также называемый линейное время , я предлагаю следующий подход (называемый " memoization ", поскольку мы сохраняем каждое вычисляемое нами значение и напрямую возвращаем его в течение времени O (1) всякий раз, когда оно спросил, следовательно, количество кадров стека будет намного меньше и будет увеличиваться максимально линейно со значением «n»).
public static void main(String[] args) {
// receive customer input
HashMap<Long, Long> map = new HashMap<>();
long result = Fib(n, map);
}
private long Fib(long n, HashMap<Long, Long> map) {
if (n <= 0) {
return 0;
}
if (n == 1) {
return 1;
}
if (map.containsKey(n)) {
return map.get(n);
} else {
map.put(n, Fib(n - 1, map) + Fib(n - 2, map));
return map.get(n);
}
}
Вы можете сравнить два решения, отправив их в упражнении Фибоначчи в Leetcode .
Кроме того, оба подхода (ваш и аналогичный мне подход к запоминанию) объясняются на вкладке «Решение» в ссылке выше, где вы можете узнать больше о сложностях времени.