[英]I need an explanation for the Fibonacci Sequence in a lambda expression
Stream.iterate(new Long[] {0L, 1L}, p -> new Long[] {p[1], p[0]+p[1]}).map(p -> p[0]);
有人可以向我解释这个 lambda 表达式的逻辑吗?
我正在尝试在 lambda 表达式中在心理上调试斐波那契数列,但我真的不明白。 没有什么有用的理由,我真的只是想了解自己的学习,我在大学学习lambda表达式(我自己写了这段代码,我还是不懂)
我知道有更好的方法可以做到这一点,但我想了解我不小心做的逻辑并且它有效
Stream.iterate()采用初始种子(此处为{0,1}
的长数组)和UnaryOperator 。
将种子设置为{0,1}
的长数组后, UnaryOperator
的每次后续迭代调用都会使用前一个数组的值创建一个new long array
,如下所示:
p[0]
设置为先前的p[1]
。p[1]
设置为之前的p[0]
+之前的p[1]
的总和。p[0]
以获得该值作为所需的术语如果运行以下命令,您可以看到它如何打印连续创建的数组和映射值。
Stream.iterate(new Long[]{0L,1L}, p -> new Long[]{p[1],p[0] + p[1]})
.limit(10)
.peek(arr -> System.out.print("p="+Arrays.toString(arr) + " --> "))
.map(p -> "p[0] = "+p[0]).forEach(System.out::println);
印刷
p=[0, 1] --> p[0] = 0
p=[1, 1] --> p[0] = 1
p=[1, 2] --> p[0] = 1
p=[2, 3] --> p[0] = 2
p=[3, 5] --> p[0] = 3
p=[5, 8] --> p[0] = 5
p=[8, 13] --> p[0] = 8
p=[13, 21] --> p[0] = 13
p=[21, 34] --> p[0] = 21
p=[34, 55] --> p[0] = 34
Stream iterate
采用 2 个参数,种子,它是第一个值和一元运算符,它定义如何根据前一个值生成下一个值。 案例中的种子是一个包含两个元素 0 和 1 的数组。运算符将第二个值放入第一位并将第一位和第二位相加到第二位,因此0, 1
-> 1, 1
, 1,1
-> 1, 2
-> 1, 2
2, 3
。 map
function 然后从每个数组中获取第一个值,从而产生斐波那契数列。
Stream::iterate 是一种根据初始条件(第一个参数)和 UnaryOperator(第二个参数)生成值的方法。 所以要分解它:
new Long[] {0L, 1L}
是您的初始值。 这是斐波那契数列的前两个元素。 从 stream 发出的第一个元素是这个值,即包含两个元素的列表。
p -> new Long[] {p[1], p[0]+p[1]}
是 function,它在第一次迭代时应用于您的初始值,然后在以后的迭代中应用于以下元素。 这遵循一次两个值的斐波那契数列,这很方便,因为下一个元素是前两个元素的总和。
.map(p -> p[0])
仅用于从 Stream::iterate 方法发出的值中提取第一个元素。
Stream.iterate
用于生成无限的 stream,您可以从中请求任意数量的值。 它使用两个参数生成 stream,一个初始种子和一个生成器 function,它使用 stream 的前一个元素来创建下一个元素。
所以看你的表情:
Stream.iterate(new Long[] {0L, 1L}, p -> new Long[] {p[1], p[0]+p[1]}).map(p -> p[0]);
这个 stream 发出的种子值和第一个值是new Long[] {0L, 1L}
,它是斐波那契数列前两个值的数组。
生成器 function 对 stream 的前一个值进行运算并生成下一个值,它是p -> new Long[] {p[1], p[0]+p[1]}
。 这是在做斐波那契计算。 它采用先前的数组p
并创建一个新数组,其中p
中的第二项成为新的第一个值,新的第二个值是前两个值的总和。
有必要存储这两个值,因为 Fibonacci 数列取决于两个先前的值,因此生成器 function 需要这两个值才能计算出下一个值。 但是,这个 stream 的用户似乎只对下一个斐波那契数感兴趣,而不是两个值的数组。 因此, map
调用.map(p -> p[0])
将 arrays 的 stream 转换为只有一个数字的 stream。
前几次迭代将 go 如下所示。 当从 stream 请求第一个值时,迭代器 stream 返回种子{0, 1}
,然后将其映射到数组的第一个值,因此整个 stream 发出0
。
此后,我们使用生成器 function 生成下一个值。 因此,当请求第二个数字时,迭代器 stream 在种子值上调用生成器,结果为{1, 1}
。 在map
ping 之后,stream 然后发出1
。
类似地,第三个数字是通过在第二个值上调用生成器生成的,它生成{1, 2}
,然后map
s 到第一个元素1
。 第四个迭代值是{2, 3}
, map
ping 到第一个元素导致2
,依此类推...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.