1 尾递归与非尾递归区别
非尾递归(线性递归):当数量很大时,会造成栈溢出。因为每次递归调用时,递归函数中的参数,局部变量等都要保存在栈中。
尾递归:return时只调用自身,不能有额外的操作。不用花费大量的栈空间来保存上次递归中的参数,局部变量等。因为上次递归操作结束后,已经将之前的数据计算出来,传递给当前的递归函数,上次递归中的局部变量和参数等被删除,释放空间,从而不会造成栈溢出。
2 尾递归特点
(1)递归调用时通过覆盖当前的栈,而不是额外创建新的栈,来减少栈空间的使用和栈的分配释放开销;栈顶不用往下展开再调回函数
(2)尾递归把变化的参数传递给递归函数的变量(比线性递归多一个参数)。这个参数是上一次调用函数得到的结果;所以,关键点在于尾递归每次调用收集结果,避免了线性递归不收集结果只能依次展开消耗内存的坏处。
3 栈调用的区别
普通递归函数自身调用次数很多,递归层级很深,栈空间为0(n),尾递归优化后栈空间可为O(1)。
(调用栈是解释器追踪函数执行流的一种机制。简单来说就是能够通过调用栈追踪到哪个函数正在执行,执行的函数中有调用了哪个函数)