Tail Recursion
tail call optimization
// 非尾递归
function fact(n) {
if (n <= 0) {
return 1;
} else {
return n * fact(n - 1);
}
}
/*
6 * fact(5)
6 * (5 * fact(4))
6 * (5 * (4 * fact(3))))
// two thousand years later...
6 * (5 * (4 * (3 * (2 * (1 * 1)))))) // <= 最终的展开
*/
// 尾递归
function fact(n, r) {
if (n <= 0) {
return 1 * r;
} else {
return fact(n - 1, r * n);
}
}
/*
fact(6, 1) // 1 是 fact(0) 的值,我们需要手动写一下
fact(5, 6)
fact(4, 30)
fact(3, 120)
fact(2, 360)
fact(1, 720)
720 // <= 最终的结果
*/Last updated