递归类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);
      }
    }
  };
}