派生クラスでmemorization
Javaでの単純なメモ化の実装は、派生クラスで上書きしてしまうことでしょうか。コード自体の汎用性はないけど、C++やC#でもほぼ同じやり方ができますしね。キャッシュ化のイディオム。
public class Fib { public long fib(int n) { System.out.println("when n=" + n); if (n <= 1) return 1; long result = fib(n - 2) + fib(n - 1); return result; } }
import java.util.*; public class MemorizedFib extends Fib { private HashMap<Integer, Long> cache = new HashMap<Integer, Long>(); public long fib(int n) { Integer arg = n; Long result = this.cache.get(arg); if (result == null) { result = super.fib(n); this.cache.put(arg, result); } return result.longValue(); } }
public class Main { public static void main(String[] args) { Fib fib = new MemorizedFib(); System.out.println(fib.fib(80)); } }
親子逆(親クラスにメモ化処理を置いて、子クラスに計算処理を置く)でも動作は同じようにうごくけど、オリジナルなものだけで実行できるようにしておきたいので普通はやらない。