function factorial(n, total=1) {
if (factorial.caller !== factorial && arguments.length >1)
throw new Error('only one param');
if (n < 3) return n*total;
return factorial(n - 1, n * total);
}
最近学习ES6,看到函数尾调这个新特性,对函数递归调用真是太有用了!我们知道递归调用算法可以写得很简单,但效率不高,但如果用上了尾调就高效了!上面是阶乘的递归尾调。如果JS支持断言就更简单了:
function factorial(n, total=1) {
if (factorial.caller !== factorial)
assert(arguments.length === 1, 'only one param');
if (n < 3) return n*total;
return factorial(n - 1, n * total);
}
注意:factorial.caller不能用arguments.caller