Scala中的尾递归,基本情况为零

时间:2014-06-03 07:03:51

标签: scala recursion functional-programming tail-recursion

假设我在scala中有这段代码:

def factorial(accumulator: Int, x: Int) : Int = {
  if(x == 1)
    return accumulator
  factorial(x * accumulator, x - 1)
}
println(factorial(1,0))

输出:

0

现在我有两个问题:

1)这个功能的定义根本不对吗? (不会给出正确的答案)我总是可以将这个函数包装在另一个函数中,并将零作为返回1的特殊情况处理,但是感觉不对,并且与正式定义一致。

2)为什么我首先回答0作为答案?为什么代码不会陷入无限循环?

2 个答案:

答案 0 :(得分:2)

def factorial(x: Int): Int = {

    @annotation.tailrec
    def factorial(accumulator: Int, x: Int): Int = {

      if (x <= 0)
        accumulator
      else
        factorial(x * accumulator, x - 1)

    }

    assert(x >= 0,"""argument should be "non-negative integer" """)
    factorial(1, x)

}
  • 您不应该让用户以错误的方式调用factorial。所以你的功能应该是内部的
  • factorial(0) = 1

答案 1 :(得分:2)

  1. 是的,您应该隐藏累加器并使其成为内部tailrec函数的参数。零的特殊情况也应该明确处理,没有任何“反对形式因子定义”。

  2. 它的工作原理是因为整数超过最大负值。