【发布时间】:2014-12-25 18:17:38
【问题描述】:
我有一个名为 Rational 的类:
class Rational(x:Int,y:Int){
def numer=x
def denom=y
def add(r: Rational) =
new Rational(numer* r.denom+ r.numer* denom,
denom* r.denom)
override def toString= numer+ "/"+ denom
def neg = new Rational(-numer, denom)
def -(that: Rational) = add(that.neg)
def < (that:Rational)=numer * that.denom < that.numer * denom
def max(that:Rational)=
if (this < (that)) that else this
def / (r: Rational) = new Rational(numer * r.denom, denom * r.numer)
def numerMIn = new Rational(numer -1, denom)
def denomMIn = new Rational(numer, denom-1)
}
我已经编写了这个函数,它是一个更大函数的子函数。我只是在调试它。 假设 b 是 Rational 3/4,我们将 Rational 2/4 传递给 iter。
def iter(c:Rational): Rational={
if (c.denom==0) new Rational(0,0) else if(!(c < b)) denomDec(c) else c add iter(denomDec(c))
}
这里是denomDec:
def denomDec(r: Rational) = new Rational(r.numer, r.denom-1)
问题是iter函数没有停止并运行到Stack Overflow。
这是在 iter() 内部发生的事情。它得到 2/4 作为参数。然后itake 2/4 + 2/3 + 当它达到2/2时,它调用denomDec在2/2之后得到2/1,因为后者不能小于3/4。然后 denomDec 达到 2/0,在这里它应该返回 new Rational(0,0) 但它没有这样做,这反过来又导致 Stack Overflow。
我的问题是,为什么函数在遇到if denomDec(r: Rational) = new Rational(r.numer, r.denom-1) 的基本情况时重复出现时不会停止
为了澄清:示例 iter(2/4) 应该这样做:2/4 + 2/3 + 0/0。 2/2 和 2/1 被跳过,因为它们都大于 3/4。
【问题讨论】:
-
试过
iter(2/0)?如果那个停止,那么你的问题是你的递归没有达到那个点。 -
它确实做到了这一点。我已经测试过了。它的作用是不断调用 denomDec 所以你得到 2/0, 2/-1, 2/-2....
-
这段代码有很多问题,它完全可以工作真是一个奇迹。
Rational(0, 0)不应该被允许存在,<不能正常工作,这几乎破坏了所有其他方法。考虑:val a = new Rational(1,2) , val b = new Rational(3,-4), a -
忘了告诉你你对否定的 Rationals 不感兴趣,所以否定的部分是无关紧要的。当 Rational 的分母为 0 时,您必须返回 0/0,这对于这个特定问题是可以的。我只是不明白为什么这个递归不会停止。
-
它似乎对我有用:
scala> iter(new Rational(2,4))res0: Rational = 38/12'b' 在迭代过程中会改变吗?
标签: scala recursion stack-overflow