對於家庭作業的總和樹我寫了一些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