在尾递归中,函数可以调用自身,并且该调用时函数的最后一个(“尾部”)操作。尾递归时能把函数优化为循环的重要的一种递归。循环可以消除潜在的栈溢出的风险,同时也因为消除了函数调用开销而提升了效率。尾递归函数中所有递归形式的调用都出现在函数的末尾,当编译器检测到一个函数调用的是尾递归时,会覆盖当前的活动记录而不是在栈中去创建一个新的。
尾递归示例:
object Demo {
def main(args: Array[String]) {
//求5的阶乘
println(factorial(5,1))
//尾递归求阶乘
@annotation.tailrec //告诉编译器要尾递归
def factorial(n:Int,m:Int):Int={ //和上一行的声明之间不能有空行的存在,否则会编译错误
if(n<=0) m
else factorial(n-1,m*n)
}
}
}