我想知道是否有可能使用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
?
答案 0 :(得分:7)
结合使用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
正如所料。
答案 1 :(得分:2)
您可以从无限的自然流开始,并使用地图。
Stream.from(0).map(func)