已知递归函数会占用栈,对空间的浪费比较严重,可能出现栈空间溢出的情况。
常用递归如下:
def fact(a: Int): Int = {
if (a == 0) return 1
fact(a - 1) * a
}
这种递归在if条件判断不成立的时候,每次都会留下一个乘以a的操作,直到if条件成立,才会一层一层释放空间。
第二种是尾递归。
@tailrec
def fact2(a: Int, currRes: Int): Int = {
if (a == 0) return currRes
fact2(a - 1, currRes * a)
}
相比于常规递归,这种尾递归在每次重新进入当前函数的时候,上次的函数操作已经全部执行完毕,没有余留操作,所以会比常规递归要节省空间。
java语言不能实现尾递归,而函数式编程语言scala可以用到。 尾递归的实现依赖于编译器的识别。



