我正在从 coursera 学习 scala。在里面reduceLeft
and reduceRight
描述如下:
然后在下一张幻灯片上,老师说这个代码模式被抽象为reduceLeft
我的问题:
- 我认为第一张幻灯片中的模式是
reduceRight
并不是reduceLeft
。你能帮我理解我错在哪里吗?例如:加法运算符[1,2,3]
会导致(1+sum(2,3))
从第一张幻灯片来看,我认为是“reduceRight”。减少左边应该是(sum(1,2)+3)
- 我无法实施
reduceLeft
as reduceRight
在第一张幻灯片中使用原始实现case
声明?您能指导我正确的方向吗?
Re 1.:
事实上,正如评论中已经证实的那样,第一张幻灯片中的模式是reduceRight
.
我认为第二张幻灯片的要点是说“可以使用标准库中的通用方法抽象出减少列表的模式”(而不是“前面幻灯片中的特定解决方案的模式对应于reduceLeft
").
Both reduceLeft
and reduceRight
将适合实施sum
。然而:当两者reduceLeft
/reduceRight
(or 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
以尾递归方式(除非您引入具有不同签名的附加辅助函数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)