递归

直接点,就是函数或者方法调用自身。

时间复杂度,理论上跟循环是一样的(抛开尾递归优化和函数调用产生的对战开销),但循环可以解决的问题,递归都可以解决。递归可以解决的问题,循环不一定可以解决(汉诺塔问题)。

尾递归:

当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归

尾递归原理:

当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。编译器可以做到这点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。虽然编译器能够优化尾递归造成的栈溢出问题,但是在编程中,我们还是应该尽量避免尾递归的出现,因为所有的尾递归都是可以用简单的goto循环替代的。

尾递归是极其重要的,不用尾递归,函数的堆栈耗用难以估量,需要保存很多中间函数的堆栈

例如:求n的阶乘

原文地址:https://www.cnblogs.com/MirAcle99/p/3865934.html