递归类JAVA中的记忆
我有一个类似这样的类:递归类JAVA中的记忆,java,recursion,memoization,Java,Recursion,Memoization,我有一个类似这样的类: public abstract class Recursion<X, R> { protected Recursion<X, R> recursion = this; public R recurse(@SuppressWarnings("unchecked") X... xs) { return recursion.recurse(xs); } } private static class LongF
public abstract class Recursion<X, R> {
protected Recursion<X, R> recursion = this;
public R recurse(@SuppressWarnings("unchecked") X... xs) {
return recursion.recurse(xs);
}
}
private static class LongFib extends Recursion<Long, Long> {
@Override
public Long recurse(Long... x) {
return x[0] <= 2 ? 1 : super.recurse(x[0] - 1) + super.recurse(x[0] - 2);
}
}
公共抽象类递归{
受保护的递归递归=此;
公共R递归(@SuppressWarnings(“未选中”)X…xs){
返回递归。递归(xs);
}
}
私有静态类LongFib扩展了递归{
@凌驾
公共长递归(长…x){
返回x[0]据我所知,在您当前的设计中,仅通过将递归
对象传递到另一个方法,无法完全实现记忆。更好的方法是让DPified
返回启用了记忆的新递归
对象
在DPified
中,您只需返回一个新的Recursion
,它覆盖recurse
方法来实现记忆
因为你说你知道备忘录是如何工作的,所以我将直接提供代码。但是,你需要实现散列
方法(因为你选择了X[]
,它不能直接与地图/列表一起工作)
公共静态递归dpIfy(递归原始){
返回新的递归(){
私有映射备忘录=新HashMap();
公共R递归(X…xs){
长哈希=哈希(xs);
if(备忘录容器(散列)){
返回memo.get(散列);
}否则{
put(散列、原始、递归(xs));
返回memo.get(散列);
}
}
};
}
“有人能告诉我如何解决这个问题吗?”如何解决什么?你的斐波那契实现也很奇怪,递归的目的是什么
?这只是一个例子,它应该适用于所有的纠错方法。加上这不是我的实现,而是我大学的实现。是的,我知道怎么做,但它必须起作用,因为这是我大学作业中的一项任务,所以有作为解决方案。我们不允许更改这些方法的签名。
Recursion<Long, Long> fib = new LongFib();
DPified.dpIfy(fib); // after calling this method the fib Object should have Memoization implemented.
long actual = fib.recurse(92L);
public static Recursion<X, R> dpIfy(Recursion<X, R> original) {
return new Recursion<X, R>() {
private Map<Long, R> memo = new HashMap<>();
public R recurse(X... xs) {
long hash = hash(xs);
if (memo.containsKey(hash)) {
return memo.get(hash);
} else {
memo.put(hash, original.recurse(xs));
return memo.get(hash);
}
}
};
}