2016-11-25 45 views
0

我正在尝试使用联合方法将两棵树联合起来。为了检查代码,我在方法中添加了打印语句。但acc的打印显示它不会随着recrsion而改变。我不明白为什么会发生这种情况。有人可以请解释。斯卡拉树木联盟

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 
} 
+3

回复:你return'的'使用 - http://stackoverflow.com/a/12560532/409976 。 –

+0

我知道我可以忽略它的方法......你是说这是造成这个问题? – sarthak

+0

@sarthak给出了答案,是的。 – Reactormonk

回答

1

,你在你的最后一个问题(Adding an element to a tree in scala)你正在做的完全一样的错误。你扔掉你的unionRec-call的结果。请记住,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))) 
+0

我最初做到了这一点,它也给出了相同的结果,但是对于每次迭代,我都会传递一个包含1个额外元素的“acc”。但是当我按照方法显示'acc'时,在所有迭代中,我看到acc的值不变。这不应该发生 – sarthak

+0

我刚刚运行你的代码与变化,它的工作。 – marstran

+0

谢谢......我不知道为什么它不适合我...... – sarthak