我正在尝试使用union方法结合两棵树。为了检查代码,我在方法中添加了print语句。但是acc
的印刷表明它并没有随着记录而改变。我不明白为什么会这样。有人可以解释一下。
class NonEmpty(elem: Tweet, left: TweetSet, right: TweetSet) extends TweetSet {
def union(that: TweetSet): TweetSet =
{
def unionRec(set:TweetSet,acc:TweetSet): TweetSet =
{
if (set.isEmpty)
return acc
else
{
acc.foreach(x=> println(x))
println("####################")
set.foreach(x=>println(x))
println("####################")
unionRec(set.takeRight,unionRec(set.takeLeft,acc.incl(set.rootTweet)))
return acc
}
}
unionRec(this,that)
}
def takeLeft: TweetSet =
{
return left
}
def takeRight: TweetSet =
{
return right
}
def rootTweet: Tweet =
{
return elem
}
def incl(x: Tweet): TweetSet = {
if (x.text < elem.text) new NonEmpty(elem, left.incl(x), right)
else if (elem.text < x.text) new NonEmpty(elem, left, right.incl(x))
else this
}
def isEmpty: Boolean = false
def foreach(f: Tweet => Unit): Unit = {
f(elem)
left.foreach(f)
right.foreach(f)
}
}
class Empty extends TweetSet {
def isEmpty: Boolean = true
}
答案 0 :(得分:1)
你犯的错误与上一个问题(Adding an element to a tree in scala)完全相同。你丢弃了unionRec
- 电话的结果。请记住,TweetSet
是不可变的,因此acc
永远不会改变!
这两行:
unionRec(set.takeRight,unionRec(set.takeLeft,acc.incl(set.rootTweet)))
return acc
必须改为:
return unionRec(set.takeRight,unionRec(set.takeLeft,acc.incl(set.rootTweet)))