単純な実装は自然で洗練されていますが、実行中に再帰呼び出しによってバイナリ ツリーが作成されます。前述のメモ化、以前の F(n) 結果のキャッシュ、不要なツリー トラバーサルの回避に加えて、前述の反復または行列乗算のテール コールの最適化を行うことができます。たとえば、Java 8 メモ化:
private static final Map<Long, Long> memo = new HashMap<>();
static {
memo.put(0L, 0L);
memo.put(1L, 1L);
}
public static void main(String[] args) {
System.out.println(fibonacci(0));
System.out.println(fibonacci(43));
System.out.println(fibonacci(92));
}
public static long fibonacci(long n) {
return memo.computeIfAbsent(n, m -> fibonacci(m - 1) + fibonacci(m - 2));
}
または、テールコール最適化バージョン:
interface FewArgs<T, U, V, R> {
public R apply(T t, U u, V v);
}
static FewArgs<Long, Long, Long, Long> tailRecursive;
static {
tailRecursive = (a, b, n) -> {
if (n > 0)
return tailRecursive.apply(b, a + b, n - 1);
return a;
};
}
a = 0、b = 1 で呼び出します。n は n 番目のフィボナッチ数である必要がありますが、93 より小さい必要があります。フィボナッチ数を計算するより効率的な方法は行列の二乗です。