js趣玩:实现js数字阶乘(正数阶乘)

689 浏览发布于 作者 zouyang (欢迎转载-请注明出处链接)留下评论分享按钮

本文举例讨论如何解出一个数字阶乘。负数阶乘本身没有多大意义,本文示例为正数阶乘。
 
假设我们有一个正数 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

(完)

想要打赏,请点击这里

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注