递归的弊端:
- 速度慢;
- 无法预测运行期间内存的使用情况;
- 递归比循环更难理解。
- 在递归调用的过程当中系统为每一层的返回点、局部变量等开辟了栈来存储,因此递归次数过多容易造成栈溢出。
栈维护了每个函数调用的信息直到函数返回后才释放,这需要占用相当大的空间,尤其是在程序中使用了许多的递归调用的情况下。
除此之外,因为有大量的信息需要保存和恢复,因此生成和销毁活跃记录(栈上的那块存储空间即栈帧)需要消耗一定的时间。我们需要考虑采用迭代的方案。
简而言之,递归过程的压栈和出栈,时间和空间都有很大的消耗,
优点:
代码简洁,实现起来比较方便。
尾递归
尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部。
尾递归就是把当前的运算结果(或路径)放在参数里传给下层函数。
递归和迭代的区别:
迭代是逐渐逼近,用新值覆盖旧值,直到满足条件后结束,不保存中间值,空间利用率高。
递归是将一个问题分解为若干相对小一点的问题,遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。