【发布时间】:2020-07-16 08:09:52
【问题描述】:
我这样定义了一个通用的 memoize 函数。
public static <T, U> Function<T, U> memoize(Function<Function<T, U>, Function<T, U>> f) {
return new Function<T, U>() {
final Map<T, U> cache = new HashMap<>();
final Function<T, U> body = f.apply(this);
@Override
public U apply(T t) {
return cache.computeIfAbsent(t, body);
}
};
}
它适用于单参数函数。
Function<BigInteger, BigInteger> fibonacci =
memoize(self -> n -> n.equals(ZERO) ? ZERO
: n.equals(ONE) ? ONE
: self.apply(n.subtract(ONE)).add(self.apply(n.subtract(TWO))));
for (long i = 0; i < 1000; ++i)
System.out.println(fibonacci.apply(BigInteger.valueOf(i)));
但是当我尝试将其应用于 curried 多参数函数时(例如 Tak (function)-Wikipedia 中的 tarai)。
Function<Integer, Function<Integer, Function<Integer, Integer>>> tarai =
memoize(fx -> x ->
memoize(fy -> y ->
memoize(fz -> z -> x <= y ? y
: fx.apply(fx.apply(x - 1).apply(y).apply(z))
.apply(fx.apply(y - 1).apply(z).apply(x))
.apply(fx.apply(z - 1).apply(x).apply(y)))));
System.out.println(tarai.apply(12).apply(6).apply(0));
它抛出ConcurrentModificaionException。
为什么会这样?我该怎么办?
我使用的是 Java 14,但我记得它在过去的版本中也可以使用。
【问题讨论】:
-
添加堆栈跟踪可能有助于回答您的问题。
标签: java memoization