对于家庭作业的总和树我写了一些Scala代码中,我有以下类和对象(用于模拟二叉树):创建二叉树斯卡拉
object Tree {
def fold[B](t: Tree, e: B, n: (Int, B, B) => B): B = t match {
case Node(value, l, r) => n(value,fold(l,e,n),fold(r,e,n))
case _ => e
}
def sumTree(t: Tree): Tree =
fold(t, Nil(), (a, b: Tree, c: Tree) => {
val left = b match {
case Node(value, _, _) => value
case _ => 0
}
val right = c match {
case Node(value, _, _) => value
case _ => 0
}
Node(a+left+right,b,c)
})
}
abstract case class Tree
case class Node(value: Int, left: Tree, right: Tree) extends Tree
case class Nil extends Tree
我的问题是关于sumTree
函数创建一个新的树,其中节点的值等于其子元素的值加上它自己的值的总和。
我觉得它很丑看,我不知道是否有更好的方法来做到这一点。如果我使用自顶向下的递归,这会更容易,但我不能想出这样的功能。
我必须实现fold
功能,具有签名的代码,来计算sumTree
我得到这个能够以更好的方式来实现的感觉,也许你有什么建议?
非常感谢,特别是你答案的最后一点。 – roelio 2012-03-12 11:08:49
@Vlad这真的很有帮助,但我真的不明白为什么需要'val nodeValue:Tree => Int'方法。任何人都可以解释为什么它必须这样做? – Sander 2013-03-05 13:51:59
@Sander,'nodeValue'抽象出重复的代码,如果你看问题中的原始代码,它包含两个独立的匹配表达式:第一个是左边,第二个是右边的子树。在这一点上,遵循代码可能会变得有点困难,因为作者的意图是混淆了细节。 使用具有描述性名称的单个帮助函数替换重复代码可以更好地反映意图,并将代码分割为更易于管理的单元。 关于Scala的伟大之处在于添加一个辅助函数并将其范围限制在即时应用程序中是多么容易。 – 2013-03-05 22:36:27