2016-11-25 56 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