//传统递归写法
function factorial(n) {
if(n === 0) {
return 1
} else {
return n * factorial(n - 1)
}
}
factorial(4) // 24
//4 * factorial(3)
//4 * 3 * factorial(2)
//4 * 3 * 2 factorial(1)
//4 * 3 * 2 * 1
1、有人认为尾调用优化需要柯里化函数来实现。
function factorial(n, res) {
if (n == 1) return res;
return factorial(n - 1, n * res)
}
var _Factorial = curry(factorial, _, 1)
_Factorial(4)
2、我们可以借助函数默认参数的方式去实现尾调用函数。
function factorial(n, s=1) {
if(n < 0) throw Error('传入的参数不能小于0')
if(n <= 1) {
return s
}
s = n * s
return factorial(n-1, s)
}
factorial(4) // 24
更多编程小技巧,请关注专栏 前端架构经验分享