一、什么是尾递归
程序调用自身的编程技巧称为递归( recursion)。尾递归是一种特殊的递归,递归形式的调用都出现在函数的末尾,我们称这个
递归函数是尾递归的。
二、尾递归的优势
尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代
码。这个调用返回时栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是在其之上重新添加
一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得高很多。
三、怎么转换尾递归
3.1 把中间结果值转换为函数参数。
比如:
递归前,
long Rescuvie(long n) {
return (n == 1) ? 1 : n * Rescuvie(n - 1);
}
递归后,
long TailRescuvie(long n, long a) {
return (n == 1) ? a : TailRescuvie(n - 1, a * n);
}
long TailRescuvie(long n) {//封装用的
return (n == 0) ? 1 : TailRescuvie(n, 1);
}
3.2 把递归结果用map或者数组存储起来
动态规划常用这种方法来优化
四、有些语言不支持尾递归怎么办?
进一步把尾递归转换成循环提高效率。