繁体   English   中英

我需要 lambda 表达式中斐波那契数列的解释

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM