【发布时间】:2018-10-31 17:17:25
【问题描述】:
我有 2 个类:RecursiveFibonacci 和 MemorizedRecursiveFibonacci。这就是我到目前为止所拥有的。
递归斐波那契类
public class SimpleRecursiveFibonacci {
public BigInteger fibonacci(int n) {
if(n < 2) {
return BigInteger.ONE;
}
return fibonacci(n - 2).add(fibonacci(n - 1));
}
}
和 MemorizedRecursiveFibonacci 类
public class MemoizedRecursiveFibonacci {
private Map<Integer, BigInteger> cache = new HashMap<>();
public BigInteger fibonacci(int n) {
if(n < 2) {
return BigInteger.ONE;
}
if(!cache.containsKey(n)){
BigInteger currentFibonacci = fibonacci(n - 2).add(fibonacci(n - 1));
cache.put(n, currentFibonacci);
}
return cache.get(n);
}
}
如我所见,MemorizedRecursiveFibonacci 类中有一些重复的代码
if(n < 2) {
return BigInteger.ONE;
和
BigInteger currentFibonacci = fibonacci(n - 2).add(fibonacci(n - 1));
如何保持干燥?删除重复代码?
【问题讨论】:
-
如何使用 MemoizedRecursiveFibonacci 并实现类似 public BigInteger fibonacci(int n, bool useCache) 的方法并让调用者使用缓存?或者使用属性@Cacheable 来装饰方法来维护缓存?
-
一个不相关的观察:记忆化版本总是用连续的整数键填充 HashMap。因此,使用 ArrayList 并使用索引而不是键会更有效。