与 Vavr 的记忆似乎不一致
Memoization with Vavr seems incosistent
当函数定义如下
static Function1<BigInteger, BigInteger> fibonacci = Function((BigInteger value) ->
value.equals(BigInteger.ZERO) ? BigInteger.ZERO
: value.equals(BigInteger.ONE) ? BigInteger.ONE
: value.equals(BigInteger.valueOf(2)) ? BigInteger.ONE
: Program.fibonacci.apply(value.subtract(BigInteger.ONE)).add(Program.fibonacci.apply(value.subtract(BigInteger.valueOf(2))))
).memoized();
并打电话给
System.out.println(fibonacci.apply(BigInteger.valueOf(1000)));
计算的很快。但是,如果我将 memoized()
移动到函数变量,如下所示
static Function1<BigInteger, BigInteger> fibonacci = Function((BigInteger value) ->
value.equals(BigInteger.ZERO) ? BigInteger.ZERO
: value.equals(BigInteger.ONE) ? BigInteger.ONE
: value.equals(BigInteger.valueOf(2)) ? BigInteger.ONE
: Program.fibonacci.apply(value.subtract(BigInteger.ONE)).add(Program.fibonacci.apply(value.subtract(BigInteger.valueOf(2))))
); // Removed memoized() from here
并打电话给
fibonacci.memoized().apply(BigInteger.valueOf(1000));
好像没有应用memoized()
需要很长时间。
这可能是什么原因?
因为 a) 递归没有在记忆形式上调用,b) 记忆的全部意义在于你需要保存记忆,而不是每次都创建一个新的记忆。
Program.fibonacci
是根据自身定义的,因此递归调用该版本,而不是记忆版本。
当函数定义如下
static Function1<BigInteger, BigInteger> fibonacci = Function((BigInteger value) ->
value.equals(BigInteger.ZERO) ? BigInteger.ZERO
: value.equals(BigInteger.ONE) ? BigInteger.ONE
: value.equals(BigInteger.valueOf(2)) ? BigInteger.ONE
: Program.fibonacci.apply(value.subtract(BigInteger.ONE)).add(Program.fibonacci.apply(value.subtract(BigInteger.valueOf(2))))
).memoized();
并打电话给
System.out.println(fibonacci.apply(BigInteger.valueOf(1000)));
计算的很快。但是,如果我将 memoized()
移动到函数变量,如下所示
static Function1<BigInteger, BigInteger> fibonacci = Function((BigInteger value) ->
value.equals(BigInteger.ZERO) ? BigInteger.ZERO
: value.equals(BigInteger.ONE) ? BigInteger.ONE
: value.equals(BigInteger.valueOf(2)) ? BigInteger.ONE
: Program.fibonacci.apply(value.subtract(BigInteger.ONE)).add(Program.fibonacci.apply(value.subtract(BigInteger.valueOf(2))))
); // Removed memoized() from here
并打电话给
fibonacci.memoized().apply(BigInteger.valueOf(1000));
好像没有应用memoized()
需要很长时间。
这可能是什么原因?
因为 a) 递归没有在记忆形式上调用,b) 记忆的全部意义在于你需要保存记忆,而不是每次都创建一个新的记忆。
Program.fibonacci
是根据自身定义的,因此递归调用该版本,而不是记忆版本。