1 普通递归
//阶乘 递归调用必须显式指明返回值类型
def fact(n: Int): Int = {
if (n == 0) 1
fact(n - 1) * n
}
2 普通递归调用过程
fact(4)
4*fact(3)
4*3*fact(2)
4*3*2*fact(1)
4*3*2*1*fact(0)
4*3*2*1*1
4*3*2*1
4*3*2
4*6
24
3 尾递归
//尾递归
def tailFact(n: Int): Int = {
def loop(n: Int, curRes: Int): Int = {
if (n == 0) return curRes
loop(n - 1, curRes * n)
}
loop(n, 1)
}
tailFact(4)
4 尾递归过程
loop(4,1)
loop(3,4)
loop(2,12)
loop(1,24)
24
总结
- 尾递归是编译器的特殊处理的行为,scala支持,python支持,java不支持
- 尾递归可以减少调用栈的高度