CodeGuru上的一个文章对递归(recursion)算法进行了一个分类,其中提到了尾递归(tail recursion)的问题,以前一直没注意过。
其实,尾递归就是将函数的递归调用写在函数体的最后,这样因为理论上不需要再保存函数栈空间上的数据(递归调用后当前函数就结束了,所以保存这些数据也没有意义),编译器就可以被优化来采用普通的跳转命令继续调用同一函数。毕竟递归调用最让人揪心的就是栈溢出的危险,如果可以解决这个问题基本上就消除了大家的后顾之忧。
另外,现在有好些新式的语言很多控制语句都需要用递归调用来实现,所以尾递归还真是一个好东西,否则总是让人提心吊胆可不是一个好的现象。
结论:如果用递归,尽量使用伪递归,over!