使用Scala的foldRight来计算多项式

时间:2015-02-13 06:07:05

标签: scala

我很难理解为什么这段代码不起作用。我有一个多项式1 + 3x + 2x ^ 2,我表示为一个列表(1.0,3.0,2.0)。为了避免将带小数的数字加电到高索引,我按如下方式评估多项式: 1 + x(3 + x(2))

对于更高的多项式,它将是a0 + x(a1 + x(a2 + x(a3 + ...)))...)

这可以方便地从右到左进行评估,虽然我可以轻松地编写一个循环,但我认为Scala的折叠运算符可能很有用。所以我在Scala提示符上尝试了这个但得到了错误的答案(应该是28.0)

scala> List(1.0, 3.0, 2.0).tail.foldRight(0.0)((a,x) => 3.0 * a + x)
res53: Double = 15.0

以下是我对折叠计算的预期:

3 * 0 + 2 = 2

3 * 2 + 3 = 9

3 * 9 + 1 = 28

我是否误解了折叠操作符,还是我错过了一些微不足道的东西?谢谢!

编辑;得到了它:

scala> List(1.0, 3.0, 2.0).foldRight(0.0)((a,x) => 3.0 * x + a)
res68: Double = 28.0

1 个答案:

答案 0 :(得分:3)

使用tail不会按照您在上述步骤中描述的内容进行折叠,因为它会跳过1.0。另外,交换参数xa

scala> List(1.0, 3.0, 2.0).foldRight(0.0)((x,a) => 3.0 * a + x)
res34: Double = 28.0