使用Vavr的记忆似乎不存在

时间:2017-11-02 19:29:37

标签: java vavr

当该功能定义如下

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(),则需要很长时间。

可能是什么原因?

1 个答案:

答案 0 :(得分:2)

因为a)在memoized表单上没有调用递归,b)记忆的整个要点是你需要保存memoization,而不是每次都创建一个新的memoization。

Program.fibonacci是根据自身定义的,因此递归调用该版本,而不是memoized版本。