如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。
阶乘通常简写成 n!
例如:
5! = 1 * 2 * 3 * 4 * 5 = 120
代码如下,使用递归思想,
function factorialize(num) {
return (num * factorialize(num - 1));
}
在函数内部继续调用。但是这样会无限递归下去,比如
5 * 4 * 3 * 2 * 1 * 0 * -1 * -2 ...
所以加上限定条件
function factorialize(num) {
if (num>0) {
return (num * factorialize(num - 1));
}
但是这样会输出
null
原来是
factorialize(5)*factorialize(4)*factorialize(3)*factorialize(2)*factorialize(1)
而factorialize(1)
并没有值。
所以再加上
function factorialize(num) {
if (num>0)
{return (num * factorialize(num - 1));}
else
return (1);
}
当num=1
的时候,factorialize(1)=1
,所以可以正确计算出结果。
结果为
factorialize(5)*factorialize(4)*factorialize(3)*factorialize(2)*factorialize(1)
并且factorialize(1)=1
总结一下代码
function factorialize(num) {
if (num>0)
{return (num * factorialize(num - 1));}
else
return (1);
}
factorialize(5);
进化版
使用函数arguments.callee
属性解耦
arguments
有一个名叫callee
属性,该属性是一个指针,指向拥有arguments
对象的函数。
原函数的执行与函数factorialize
紧紧耦合到了一起,这不优雅,所以可以使用arguments.callee
属性解耦
function factorialize(num) {
if (num>0) {
return (num * arguments.callee(num - 1));
} else {return (1);}
}
这样无论引用函数使用什么名字,都可以正常递归,例如
var trueFactorialize = factorialize;
factorialize = function () {
return 0;
};
console.log(trueFactorialize(5)); //120
console.log(factorialize(5)); //0
即使factorialize
变了,trueFactorialize
也可以正常计算阶乘。