递归函数溢出,为什么?

时间:2012-12-22 23:36:29

标签: scala recursion overflow

以下功能溢出,我不明白为什么。当使用x作为0,y作为0并且dim作为2运行时,结果应为6.但是,我收到一个错误,指示函数中的某些Long值(x或y)在溢出时为554。这不应该是可能的,因为x和y都受昏暗值限制,在我的测试中它被设置为2。 这是代码:

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)
  }
}

2 个答案:

答案 0 :(得分:5)

您在两个地方缺少else。这意味着您的最后一行甚至会在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)
}

答案 1 :(得分:1)

克里斯:

你的函数不是尾递归的,因为在你的上一个语句中你有一个总和。这个总和偶然涉及到lattice的两次调用。但是,要进行尾递归,您的最后一个statament必须是常量(就像您在第一个if中所做的那样)或只是调用函数本身(例如您的2 else if s。

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

谢谢,

Rafael Afonso