Вы можете использовать Memoization , чтобы избежать рекурсии головы.
Я протестировал следующий код, когда N <= 40, этот подход плох, потому что у Map есть компромисс. </p>
private static final Map<Integer,Long> map = new HashMap<Integer,Long>();
private static long fibonacciRecursiveMemoization(int num) {
if (num == 0) {
return 0L;
}
if (num == 1) {
return 1L;
}
int num1 = num - 1;
int num2 = num - 2;
long numResult1 = 0;
long numResult2 = 0;
if(map.containsKey(num1)){
numResult1 = map.get(num1);
}else{
numResult1 = fibonacciRecursiveMemoization(num1);
map.put(num1, numResult1);
}
if(map.containsKey(num2)){
numResult2 = map.get(num2);
}else{
numResult2 = fibonacciRecursiveMemoization(num2);
map.put(num2, numResult2);
}
return numResult1 + numResult2;
}
при значении n: 44
Использование итерации: время итерации = 6984
Использование рекурсии хвоста: рекурсивное время хвоста = 8940
Использование мемоизацииРекурсия: рекурсивное время запоминания = 1799949
Использование рекурсии: рекурсивное время головы = 12697568825