什么是递归?
函数调用自身,称为递归。
什么是尾递归?
如果尾调用自身,就称为尾递归。
两者的区别
递归非常消耗内存,因为需要同时保存成千上百个调用记录,很容易发生“栈溢出”错误(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)。
本文深入探讨了递归与尾递归的概念及其在函数调用中的应用。递归是指函数调用自身,可能引发栈溢出错误;而尾递归通过优化调用过程,避免了此类问题,有效提升了效率。
1571

被折叠的 条评论
为什么被折叠?



