本文举例讨论如何解出一个数字阶乘。负数阶乘本身没有多大意义,本文示例为正数阶乘。
假设我们有一个正数 5,我们要实现 5 的阶乘,得到阶乘结果 120(PS:5*4*3*2*1=120)
我们可以用多种方法来实现,比如:
方法1:递归相乘(下例各种示例的if-else 循环 应该把最大可能出现的情况放在第一个if内而提升性能,为了大家阅读代码时更顺畅,所以暂未作此优化)
function factorialize(num) {
if (num < 0) {
return -1;
} else if (num === 0 || num === 1) {
return 1;
} else {
return ( num * factorialize(num - 1) ); //递归调用自身
}
};
console.log( factorialize(5) ); //120
//优化,在非严格模式下("use strict"),函数名可以用 arguments.callee 替代(严格模式使用arguments.callee会报错):
function factorialize(num) {
if (num < 0) {
return -1;
} else if (num === 0 || num === 1) {
return 1;
} else {
return ( num * arguments.callee(num - 1) ); //arguments.callee 替代 factorialize
}
};
console.log( factorialize(5) ); //120
方法2:循环相乘
//通过for循环循环递减实现阶乘
function factorialize (num) {
if (num < 0) {
return -1;
} else if (num === 0 || num === 1) {
return 1;
} else {
for (var i = num - 1; i >= 1; i--) { //递减
num *= i;
}
}
return num;
};
console.log( factorialize(5) ); //120
//还可以使用循环递加的方式实现:
function factorialize (num) {
if (num < 0) {
return -1;
} else if (num === 0 || num === 1) {
return 1;
} else {
var total = 1;
for (var i = 1; i <= num; i++) { //递加
total *= i;
}
}
return total;
};
console.log( factorialize(5) ); //120
PS:另外可以使用 while 循环等其它形式的循环,原理一致,只是使用的不同循环方式而已
方法3:通过数组的 reduce 函数实现阶乘
function factorialize (num) {
if (num < 0) {
return -1;
} else if (num === 0 || num === 1) {
return 1;
} else {
//先制作递增数组
var arr = [];
for(var i=1; i <= num; i++){
arr.push(i);
}
//reduce阶乘
return arr.reduce(function(x,y){
return x*y;
});
}
};
console.log( factorialize(5) ); //120
(完)
想要打赏,请点击这里