【问题标题】:Memoization in Recursion Class JAVA递归类 JAVA 中的记忆
【发布时间】:2016-01-08 14:55:06
【问题描述】:

我有一个如下所示的类:

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);
    }
}

现在我必须构建一个方法,为这个方法添加记忆。

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);

我知道 memoization 是如何工作的,但我不知道如何拦截方法调用。有什么建议吗?

【问题讨论】:

  • "有人能给我一个解决办法吗?"怎么解决什么?你的斐波那契实现也很奇怪,Recursion&lt;X, R&gt; 的目的是什么?
  • 这只是一个示例,它应该适用于所有递归方法。添加这不是我的实施它是我的大学之一。

标签: java recursion memoization


【解决方案1】:

据我所知,就您当前的设计而言,仅通过将 Recursion 对象传递给另一个方法就无法完全实现记忆化。更好的方法是让DPified 返回一个启用了记忆功能的新Recursion 对象。

DPified 中,您只需返回一个新的Recursion,它会覆盖recurse 方法来实现记忆化。

因为你说你知道 memoization 是如何工作的,所以我直接提供代码。但是,您需要实现 hash 方法(因为您选择了 X[],它不能直接与地图/列表一起使用)。

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);
      }
    }
  };
}

【讨论】:

  • 是的,我知道该怎么做,但它必须有效,因为这是我大学作业中的一项任务,所以必须有一个解决方案。而且我们不允许更改这些方法的签名。
猜你喜欢
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2018-10-29
  • 2012-11-12
  • 2012-09-27
  • 1970-01-01
  • 2018-09-08
相关资源
最近更新 更多