斯卡拉树木联盟

时间:2016-11-25 18:58:50

标签: scala

我正在尝试使用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
}

1 个答案:

答案 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)))