【发布时间】:2016-11-26 01:33:23
【问题描述】:
在这段代码中,我试图将两棵树合并如下:
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
return unionRec(right,unionRec(left,acc.incl(elem)))
}
unionRec(this,that)
}
def isEmpty: Boolean = false
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
}
}
class Empty extends TweetSet {
def isEmpty: Boolean = true
}
但是当我尝试执行 union 方法时,我得到了 stackOverflow 错误:
java.lang.StackOverflowError
at scala.collection.immutable.StringLike$class.compare(StringLike.scala:74)
at scala.collection.immutable.StringOps.compare(StringOps.scala:30)
at scala.collection.immutable.StringOps.compare(StringOps.scala:30)
at scala.math.Ordered$class.$less(Ordered.scala:76)
at scala.collection.immutable.StringOps.$less(StringOps.scala:30)
at objsets.NonEmpty.incl(TweetSet.scala:235)
at objsets.NonEmpty.incl(TweetSet.scala:236)
at objsets.NonEmpty.incl(TweetSet.scala:235)
at objsets.NonEmpty.incl(TweetSet.scala:236)
at objsets.NonEmpty.incl(TweetSet.scala:235)
at objsets.NonEmpty.incl(TweetSet.scala:235)
at objsets.NonEmpty.incl(TweetSet.scala:236)
at objsets.NonEmpty.incl(TweetSet.scala:236)
at objsets.NonEmpty.incl(TweetSet.scala:235)
为什么会这样?
【问题讨论】:
-
能否请您也将 inc 方法定义添加到帖子中?和推文集
-
添加了代码...
-
你了解 inc 方法的递归性质吗?这是解决这个问题的关键。
-
如果您可以访问 coursera 数学。尝试阅读相关主题。
-
考虑这一行:
if (x.text < elem.text) new NonEmpty(elem, left.incl(x), right)。当left为空时,会发生什么?
标签: scala