0

当函数定义如下

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()按如下方式移动 to 函数变量

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()就像没有应用一样需要很长时间。

这可能是什么原因?

4

1 回答 1

2

因为a)没有在记忆形式上调用递归,b)记忆的全部意义在于您需要保存记忆,而不是每次都创建新的记忆。

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

于 2017-11-02T20:02:43.340 回答