在我之前的问题中
我问到如何用Java8流的回忆录以简洁的数学方式编写代码来定义斐波纳契的无限序列。
谢天谢地,我得到了答案,下面的代码似乎运行得很好:
LongStream fibs = Stream
.iterate(
new long[]{1, 1},
f -> new long[]{f[1], f[0] + f[1]}
)
.mapToLong(f -> f[0]);
fibs
.limit(30)
.forEach(System.out::println);1 1 2 3 5 8 13 21 34 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 121393 317811 514229 832040
尽管Java8中函数的代码样式表示方式仍然让我感到困惑,但我可以相当肯定它对应于fibonacci序列的数学定义。
计算速度表明它回溯了这个函数,他说
您可以拿出基于地图的回忆录斐波纳契(X),并由此产生无限的流:
map-based memoized in Java8是什么?
而且,我无法按照逻辑的角色
.mapToLong(f -> f[0]);
你能解释一下吗。任何参考资料/文件也将不胜感激。谢谢。
发布于 2015-05-27 18:58:24
正如米沙所说,回忆录是“Supplier<Long> 功能接口”,因为它存储了两个私人变量n1和n2。然后,该对象具有可变的状态,并具有副作用。它在使用平行化时可能会产生问题。
new Supplier<Long>() {
private long n1 = 1;
private long n2 = 2;
@Override
public Long get() {
long fibonacci = n1;
long n3 = n2 + n1;
n1 = n2;
n2 = n3;
return fibonacci;
}
}在与iterate相反的解决方案是不可变的,并准备并行化。它生成大小为2的long数组流,从1,1开始,并迭代地应用函数f -> new long[]{f[1], f[0] + f[1]}
.iterate(
new long[]{1, 1},
f -> new long[]{f[1], f[0] + f[1]}
)https://stackoverflow.com/questions/26290716
复制相似问题