Wonkyung Wayne Kim:
Declaro HashMap para memoization y paso en el método recursivo, pero parece que HashMap en realidad no almacenar los datos y conseguir reinicia cada llamada recursiva. Este es un ejemplo a continuación:
public static int fib(int n) {
Map<Integer, Integer> memo = new HashMap<>();
return fib(n, memo);
}
private static int fib(int n, Map<Integer, Integer> memo) {
if (n < 0) {
throw new IllegalArgumentException(
"Index was negative. No such thing as a negative index in a series.");
// base cases
} else if (n == 0 || n == 1) {
return n;
}
// see if we've already calculated this
if (memo.containsKey(n)) {
System.out.printf("grabbing memo[%d]\n", n);
return memo.get(n);
}
System.out.printf("computing fib(%d)\n", n);
int result = fib(n - 1) + fib(n - 2);
// memoize
memo.put(n, result);
return result;
}
de salida es, como a continuación
computing fib(10)
computing fib(9)
computing fib(8)
computing fib(7)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(7)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(8)
computing fib(7)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
Pero está funcionando bien si tengo HashMap como variable estática y os lo anunciará a lado de mi fib (), pero eso no es lo que quería hacer. ¿Puede alguien ayudarme?
Gracias.
Jason:
El método fib(int, Map)
en realidad nunca se llama de forma recursiva. El mapa se crea cada vez que nunca se utiliza. Deshacerse de fib(int)
y reemplazar con llamadas a fib(int, Map)
.
fib(n - 1, memo) + fib(n - 2, memo);