如何优化Scala double Call of Recursive Function
How to optimize Scala double Call of Recursive Function
我正在尝试让这个递归函数工作:
@tailrec
def rec(n: BigInt): BigInt = {
if (n == 0) 0
else if (n == 1) 1
else (rec(n - 1) + rec(n - 2))
}
Error:(13, 24) could not optimize @tailrec annotated method rec: it contains a recursive call not in tail position
else (rec(n - 1) + rec(n - 2))
如何优化它以与 tailrec 一起使用?
您将不得不编写一个尾递归辅助函数:
def rec(n: BigInt): BigInt = {
@tailrec
def helper(n: BigInt, previous: BigInt, next: BigInt): BigInt = {
if (n == 0) previous
else if (n == 1) next
else helper(n - 1, next, (next + previous))
}
helper(n,0,1)
}
这样一来,您就可以将序列的上一个值和下一个值传递给函数,从而只允许调用一次函数。
这是一种常见的模式,因为许多递归算法只能通过额外的控制流机制(例如:连续传递)来实现尾递归。
阶乘是另一个很好的例子,需要编写一个带有额外参数的辅助函数来使其尾递归。
我正在尝试让这个递归函数工作:
@tailrec
def rec(n: BigInt): BigInt = {
if (n == 0) 0
else if (n == 1) 1
else (rec(n - 1) + rec(n - 2))
}
Error:(13, 24) could not optimize @tailrec annotated method rec: it contains a recursive call not in tail position else (rec(n - 1) + rec(n - 2))
如何优化它以与 tailrec 一起使用?
您将不得不编写一个尾递归辅助函数:
def rec(n: BigInt): BigInt = {
@tailrec
def helper(n: BigInt, previous: BigInt, next: BigInt): BigInt = {
if (n == 0) previous
else if (n == 1) next
else helper(n - 1, next, (next + previous))
}
helper(n,0,1)
}
这样一来,您就可以将序列的上一个值和下一个值传递给函数,从而只允许调用一次函数。
这是一种常见的模式,因为许多递归算法只能通过额外的控制流机制(例如:连续传递)来实现尾递归。 阶乘是另一个很好的例子,需要编写一个带有额外参数的辅助函数来使其尾递归。