Я пытаюсь создать мемоизированную версию функции Factorial. Когда я вызываю factMemoized (4), он впервые вычисляет факториал 4 и сохраняет его в Map. Когда я снова вызываю factMemoized (4), теперь он дает сохраненный результат вместо его повторного вычисления. Это работает, как ожидалось. Но когда я вызываю factMemoized (3), он пересчитывает значение, несмотря на то, что он вычислил факт (3) как часть вычисления факта (4). Есть ли способ убедиться, что даже значения, вычисленные как часть рекурсивных вызовов, будут сохранены на карте без добавления функции мемоизации в функцию fact ()?
import java.util.HashMap;
import java.util.Map;
public class MemoizeBetter {
public static <F, T> Function<F, T> memoize(final Function<F, T> inputFunction) {
return new Function<F, T>() {
// Holds previous results
Map<F, T> memoization = new HashMap<F, T>();
@Override
public T apply(final F input) {
// Check for previous results
if (!memoization.containsKey(input)) {
// None exists, so compute and store a new one
memoization.put(input, inputFunction.apply(input));
}else{
System.out.println("Cache hit:"+input);
}
// At this point a result is guaranteed in the memoization
return memoization.get(input);
}
};
}
public static void main(String args[]){
final Function<Integer, Integer> fact = new Function<Integer, Integer>() {
@Override
public Integer apply(final Integer input) {
System.out.println("Fact: " + input);
if(input == 1)
return 1;
else return input * apply(input -1);
}
};
final Function<Integer, Integer> factMemoized = MemoizeBetter.memoize(fact);
System.out.println("Result:"+ factMemoized.apply(1));
System.out.println("Result:"+factMemoized.apply(2));
System.out.println("Result:"+factMemoized.apply(3));
System.out.println("Result:"+factMemoized.apply(2));
System.out.println("Result:"+factMemoized.apply(4));
System.out.println("Result:"+factMemoized.apply(1)); }
}
interface Function<F,T>{
T apply(F input);
}