scala - Stack overflow. Function fails to stop at base case -
scala - Stack overflow. Function fails to stop at base case -
i have class called 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)) else 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) }
i've written function, subfunction of bigger one. i'm debugging it. assume b rational 3/4 , pass 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 together iter(denomdec(c)) }
and here's denomdec:
def denomdec(r: rational) = new rational(r.numer, r.denom-1)
the problem iter function not stop , runs stack overflow.
here's happens within iter(). gets 2/4 argument. itake 2/4 + 2/3 + when reaches 2/2, calls denomdec 2/1 after 2/2 because latter fails smaller 3/4. denomdec gets 2/0 , here supposed homecoming new rational(0,0) fails in turn causes stack overflow.
my question why doesn't function stop when recurring when hits base of operations case if denomdec(r: rational) = new rational(r.numer, r.denom-1)
for clarification: illustration iter(2/4) should this: 2/4 + 2/3 + 0/0. 2/2 , 2/1 skipped both greater 3/4.
maybe problem out of presented scope; have tested code , not error:
iter(new rational(2,4)) //> denomdec | old / new denom 4 / 3 //| denomdec | old / new denom 3 / 2 //| iter | c<b //| denomdec | old / new denom 2 / 1 //| add together | adding 2 rationals: 2/3, 2/1 //| add together | gives: 8/3 //| add together | adding 2 rationals: 2/4, 8/3 //| add together | gives: 38/12 //| res0: test.rational = 38/12 iter(new rational(2,0)) //> iter | denom=0 //| res0: test.rational = 0/0 iter(new rational(0,4)) //> denomdec | old / new denom 4 / 3 //| denomdec | old / new denom 3 / 2 //| denomdec | old / new denom 2 / 1 //| denomdec | old / new denom 1 / 0 //| iter | denom=0 //| add together | adding 2 rationals: 0/1, 0/0 //| add together | gives: 0/0 //| add together | adding 2 rationals: 0/2, 0/0 //| add together | gives: 0/0 //| add together | adding 2 rationals: 0/3, 0/0 //| add together | gives: 0/0 //| add together | adding 2 rationals: 0/4, 0/0 //| add together | gives: 0/0 //| res0: test.rational = 0/0
scala recursion stack-overflow
Comments
Post a Comment