`Java8中基于地图的记忆?
在我前面的问题中 我问过如何编写一个代码,用Java8流的memonization以简洁的数学方式定义fibonacci的无限序列 谢天谢地,我得到了一个答案,下面的代码似乎工作得很好:`Java8中基于地图的记忆?,java,dictionary,functional-programming,java-8,java-stream,Java,Dictionary,Functional Programming,Java 8,Java Stream,在我前面的问题中 我问过如何编写一个代码,用Java8流的memonization以简洁的数学方式定义fibonacci的无限序列 谢天谢地,我得到了一个答案,下面的代码似乎工作得很好: LongStream fibs = Stream .iterate( new long[]{1, 1}, f -> new long[]{f[1], f[0] + f[1]} )
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.
2.
3.
5.
8.
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
虽然Java8中函数的代码样式表示仍然让我感到困惑,但我可以相当肯定它符合斐波那契序列的数学定义
他说,计算速度表明它可以记忆函数
您可以使用基于地图的记忆斐波那契(x)并从中生成无限流,如下所示:
在Java8中,什么是基于地图的记忆
而且,我无法理解
.mapToLong(f->f[0])代码>
你能解释一下吗。如有任何参考/文件,也将不胜感激。谢谢。正如米莎所说,之所以要记录的是供应商
,因为它存储了两个私有变量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;
}
}
我想你误解了你引用的评论。它指的是IntStream.iterate(1,i->i+1).mapToLong(i->fibonacci(i))在最初的问题中,你有一个记忆斐波那契函数的定义,但说“这不是一个无限序列”。所以我在演示如何使用已经记忆的函数来生成无限流。
.iterate(
new long[]{1, 1},
f -> new long[]{f[1], f[0] + f[1]}
)