ES 6関数尾調合caler

661 ワード

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);
}
最近ES 6を勉強しています.関数の最後の調整という新しい特性を見て、関数の再帰的な呼び出しにとても役に立ちました.再帰的呼び出しアルゴリズムは簡単に書くことができますが、効率はあまり良くないです.しかし、もし最終調整を使ったら効率が高いです.上は階乗の再帰尾調です.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);
}
注意:factoral.callerはargments.callerを使用できません.