说到递归,很容易想到数学归纳法。
递归,通过反复对函数自身的调用来实现,有递的过程,也有归的过程。普通的递归,在递的过程中依赖着函数的返回值,每递一步,都需要将前一步的信息压栈,在归的过程中,再一步步出栈,直到结束。尾递归,作为递归的特例,指递归调用发生在过程中最后一个语句,它的返回值不再参与运算。尾递归的特征决定了在层层调用的过程中,老的堆栈信息已没有任何意义,所以大部分的编译器在发现是尾递归时,会做优化处理,老的堆栈信息将被新的堆栈所覆盖,所以尾递归不存在普通递归随着递归层次增加可能导致堆栈溢出的问题。