什么是递归?
函数调用自身,称为递归。
什么是尾递归?
如果尾调用自身,就称为尾递归。
两者的区别
递归非常消耗内存,因为需要同时保存成千上百个调用记录,很容易发生“栈溢出”错误(stack overflow)。
但对于尾递归来说,由于只存在一个调用记录,所以永远不会发生”栈溢出“错误。
举例说明如下:阶乘函数n!
递归函数:
fun factorial(n:Int):Int{
if(n <= 1) return n
else return n*factorial(n-1)
}
此时最多需要保存n个调用记录,复杂度O(n)。
而如果改写成尾递归:
fun factorial(n:Int, total:Int):Int{
if(n <= 1) return n
else return factorial(n-1,n*total)
}
只保留一个调用记录,复杂度O(1)。