递归与尾递归

什么是递归?

函数调用自身,称为递归。

 

什么是尾递归?

如果尾调用自身,就称为尾递归。

 

两者的区别

递归非常消耗内存,因为需要同时保存成千上百个调用记录,很容易发生“栈溢出”错误(stack overflow)。

但对于尾递归来说,由于只存在一个调用记录,所以永远不会发生”栈溢出“错误。

递归与尾递归_第1张图片

举例说明如下:阶乘函数n!

递归函数:

fun factorial(n:Int):Int{
  if(n <= 1) return n
  else return n*factorial(n-1)
}

 递归与尾递归_第2张图片递归与尾递归_第3张图片

此时最多需要保存n个调用记录,复杂度O(n)。

 

而如果改写成尾递归:

fun factorial(n:Int, total:Int):Int{
  if(n <= 1) return n
  else return factorial(n-1,n*total)
}

递归与尾递归_第4张图片递归与尾递归_第5张图片
只保留一个调用记录,复杂度O(1)。

 

 

 

你可能感兴趣的:(数据结构)