Napisałem program do obliczania liczby Fibonacci rekurencyjnie, z ConcurrentHashMap
i computeIfAbsent()
metody:ConcurrentHashMap i Fibonacciego Liczby - Niezgodne wynik
program działa absolutnie bez zarzutu, gdy użyłem małych wartości jak 8,9,10
ale utknęła w niekończącej się pętli, gdy wartość wzrosła z 10 to 20
program nie zatrzymuje
public class Test {
static Map<Integer, Integer> concurrentMap = new ConcurrentHashMap<>();
public static void main(String[] args) {
System.out.println("Fibonacci result for 20 is" + fibonacci(20));
}
static int fibonacci(int i) {
if (i == 0)
return i;
if (i == 1)
return 1;
return concurrentMap.computeIfAbsent(i, (key) -> {
System.out.println("Value is " + key);
return fibonacci(i - 2) + fibonacci(i - 1);
});
}
}
Czy ktoś mi powiedzieć, dlaczego jest tkwić wiecznie?
Masz wyjaśnienie poniżej, ale to, co powiedziałem o rekurencyjnym Fibonacciego jest ważne; używaj programowania dynamicznego, jeśli naprawdę potrzebujesz generować sekwencje o wysokiej sekwencji Fibonacciego. –
@ TimBiegeleisen- Tak, będę .. ja po prostu bawiłem się z równoczesną mapą skrótu i znalazłem to ... :) –
@TimBiegeleisen OP robił dynamiczne programowanie, tylko w nie tak oczywisty sposób. Każdy termin liczby fibonacci jest obliczany tylko wtedy, gdy nie został wcześniej obliczony. Jeśli został wcześniej obliczony, wartość jest porównywana z 'concurrentMap' –