在尾遞歸中,函數可以調用自身,並且該調用時函數的最後一個(“尾部”)操作。尾遞歸時能把函數優化爲循環的重要的一種遞歸。循環可以消除潛在的棧溢出的風險,同時也因爲消除了函數調用開銷而提升了效率。尾遞歸函數中所有遞歸形式的調用都出現在函數的末尾,當編譯器檢測到一個函數調用的是尾遞歸時,會覆蓋當前的活動記錄而不是在棧中去創建一個新的。
尾遞歸示例:
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)
}
}
}