gpt4 book ai didi

scala - 在scala中使用流定义系列

转载 作者:行者123 更新时间:2023-12-01 20:15:54 25 4
gpt4 key购买 nike

我想知道是否有可能使用 scala Stream 定义无限级数

我接下来尝试过:

Stream.tabulate(Int.MaxValue)(n => func(n))

其中 func 是计算系列中单个成员的函数(例如 1/n! 用于计算 e)

但这实际上并不正确。因为这个系列将有最大的 Int.MaxValue 成员。这对于绝对收敛的级数来说可能就足够了。但是,如果系列既有积极成员又有消极成员(可能不是交替的)怎么办?

PS我想以接下来的方式使用这样的系列

val stream = Stream.tabulate(Int.MaxValue)(n => func(n))
val seriesSum =
(stream zip stream.tail).takeWhile{case(a, b) => abs(abs(a) - abs(b)) > Error}.map(_._1).sum

其中 Error 例如为 0.00001

我应该使用什么来代替 Stream.tabulate

最佳答案

您可以通过结合使用 Stream.iterate 和 scanLeft 来非常简单地完成此类操作:

def factorial(n: BigInt): BigInt = (BigInt(1) to n).reduceLeft(_ * _)

def factorials = Stream.iterate(BigInt(1))(_ + 1).map(factorial)

def values = factorials.scanLeft(BigDecimal(0))(_ + 1 / BigDecimal(_))

然后:

scala> values.take(10).foreach(println)
0
1
1.5
1.6666666666666666666666666666666667
1.70833333333333333333333333333333337
1.716666666666666666666666666666666703
1.718055555555555555555555555555555592
1.7182539682539682539682539682539682904
1.71827876984126984126984126984126987770
1.718281525573192239858906525573192276289

正如预期的那样。

关于scala - 在scala中使用流定义系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20731922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com