使用scala中的流定义系列

时间:2013-12-22 17:17:16

标签: scala math stream series

我想知道是否有可能使用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

2 个答案:

答案 0 :(得分:7)

结合使用Stream.iteratescanLeft,您可以直截了当地做这件事:

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)