В качестве домашнего задания я написал некоторый код 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
, которая создает новое дерево, в котором узлы имеют значения, равные t o сумма значений его дочерних элементов плюс его собственное значение.
Я нахожу это довольно уродливым, и мне интересно, есть ли лучший способ сделать это. Если бы я использовал рекурсию, которая работает сверху вниз, это было бы проще, но я не смог придумать такую функцию.
Мне нужно реализовать функцию fold
с подписью, как в коде, для вычисления sumTree
У меня такое чувство, что это можно реализовать лучше, может быть, у вас есть предложения?