java - Vavr 的内存似乎不一致

标签 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() 一样。

这可能是什么原因?

最佳答案

因为 a) 不会在内存形式上调用递归,b) 内存的重点是您需要保存内存,而不是每次都创建新的内存。

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

关于java - Vavr 的内存似乎不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47083225/

相关文章:

java - 使用 XSLT 即 XML 转换器时防止 DTD 下载

java - 使用Java和Vavr使用功能样式异常处理的逻辑

java-8 - Vavr性能测试

java - Vavr 对象的序列化器/反序列化器

java - 返回 Try 的方法是否允许抛出异常?

java - 从具有相同成员的列表中过滤对象

java - 如何使用 Java 执行多个 UNIX 命令并捕获单个输出或错误(如果有)

java - Spring验证不遵循POJO原则

java - 如何将 "&nbsp;"表示为 Scanner 的分隔符

java - Python、Java 和 C 中的嵌套循环比较