2012-12-22 78 views
1

下面的函数溢出了,我不明白为什么。当x以0运行,y为0并且暗淡为2时,结果应该是6.但是,我收到一个错误,指出函数中的某个Long值(x或y)在溢出时为554。在两个地方递归函数溢出,为什么?

def lattice(dim: Long, x: Long, y: Long): Long = { 
    if (x == dim && y == dim) { 
    1 
    } 
    if (x >= dim) { 
    lattice(dim,x,y+1L) 
    } 
    if (y >= dim) { 
    lattice(dim,x+1L,y) 
    } 
    else { 
    lattice(dim,x+1L,y) + lattice(dim,x,y+1L) 
    } 
} 

回答

5

你缺少else:X和Y都是借着昏暗的值,这在我的测试设置为2 下面是代码界这应该是不可能的。这意味着即使当x >= dim时,您的最后一行也会运行,导致x超过dim。试试这个:

if (x == dim && y == dim) { 
    1 
} else if (x >= dim) { 
    lattice(dim,x,y+1L) 
} else if (y >= dim) { 
    lattice(dim,x+1L,y) 
} else { 
    lattice(dim,x+1L,y) + lattice(dim,x,y+1L) 
} 
+0

哦,现在我到觉得自己很蠢。谢谢Mark! –

+0

另外,有没有什么办法可以优化这个函数的尾部-Recursive? –

+0

@ChrisGrimm:我可能不是最好的人回答你的新问题。 –

1

克里斯:

你几乎函数不是尾递归,因为你的最后陈述你的总和。这笔款项总共涉及两项致电lattice。然而,要尾递归你最后statament必须是一个常量(就像你在你的第一个if所做的那样),或只是调用函数本身(如你的2 else if秒。

我承认,我不知道如何改变你的函数是尾递归。根据您的alghoritm的,也许是不可能做你的函数尾递归。

感谢,

拉斐尔·阿丰索