假设我在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作为答案?为什么代码不会陷入无限循环?
答案 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)
}
答案 1 :(得分:2)
是的,您应该隐藏累加器并使其成为内部tailrec函数的参数。零的特殊情况也应该明确处理,没有任何“反对形式因子定义”。
它的工作原理是因为整数超过最大负值。