尾递归并不是函数式编程才有的特性,c++ 里面也是有的。第一次接触尾递归,是在 UW的coursera课程中,第二次是在sensetime的面试中,面试官问我了解尾递归吗,什么情况下编译器可以用尾递归优化。这里虽然使用 scala作为实例讲解尾递归,但请注意,这并不是函数式语言中才有的特性
先说定义,尾递归就是一种特殊的递归,这种递归编译器可以优化,怎么优化呢?如果递归的过程中可以用被调用函数的栈将调用者函数的栈完全覆盖掉(而和不覆盖掉的运行效果是一样的),那么编译器就可以用尾递归优化,
这是 课程中的一个定义
example1
def gcd(a:Int,b:Int):Int={
if(b==0)a
else gcd(b,a%b)
}
这里函数 gcd 有一个递归调用,可是其实可以完全用递归函数的栈覆盖掉原来的函数,而不产生任何问题
它的函数调用栈大概长成这样,左 非尾递归,右 尾递归
<