我正在从 coursera 学习 scala。在
reduceLeft
和reduceRight
的描述中出现了:
然后在下一张幻灯片上,老师说这个代码模式被抽象为
reduceLeft
我的问题:
reduceRight
而不是reduceLeft
。你能帮我理解我错在哪里吗?例如:[1,2,3]
上的加法运算符会导致第一张幻灯片中的 (1+sum(2,3))
,我认为这是 reduceRight。 reduceLeft 应该是 (sum(1,2)+3)
reduceLeft
,因为 reduceRight
是在第一张幻灯片中使用 case
语句原始实施的?你能指导我正确的方向吗?Re 1.:
事实上,正如评论中已经确认的那样,第一张幻灯片中的模式是
reduceLeft
。
我认为第二张幻灯片的重点是说“可以使用标准库中的通用方法抽象出减少列表的模式”(而不是“前面幻灯片中的特定解决方案的模式对应于
foldLeft
").
reduceLeft
和reduceRight
都适合实施sum
。但是:当 reduceLeft
/reduceRight
(或 foldLeft
/foldRight
)都适合解决方案时,在 Scala 中通常更喜欢 Left
变体(尤其是在使用 List
s 时),因为它的实现在 List
s 上稍微更有效率。这无疑是关注第二张幻灯片上reduceLeft
的动机。
Re 2.:
如果要实现第一张幻灯片的
sum
左缩减,需要三种情况:
def sum(xs: List[Int]): Int = xs match
case Nil => 0
case x :: Nil => ???
case x :: y :: tail => ???
我留给你填写
???
s.
请注意,不可能以尾递归方式实现此左缩减
sum
(除非您引入具有不同签名的附加辅助函数)。