package bilibili
import scala.annotation.tailrec
/**
* @author 王子健
* @date 2021/7/19 16:31
* @VERSION 1.0
*/
object digui {
//阶乘
def jiecheng(n:Int):Int={
if(n==0) return 1
n*jiecheng(n-1)
}
//尾递归阶乘
def jiecheng2(n:Int):Int={
@tailrec
def loop(n :Int , res :Int):Int={
if(n==0) return res
loop(n-1,n*res)
}
loop(n,1)
}
def main(args: Array[String]): Unit = {
//println(jiecheng(5))
println(jiecheng2(5))
}
}
递归调用时,每次需要n-1 的返回结果,每次都必须保留堆中的对象
尾递归调用时,不需要n-1 的运行返回结果,而是将他们保存在res中,每次直接覆盖n-1 对象。