我在写一个能够分解数字的函数时遇到了一些问题。困难的部分已经完成。但是,当num为0时,我似乎无法告诉函数返回1。
PS:你会用哪种其他方式在JavaScript中编写相同的函数?
var arrOfNum = [];
function factorialize(num) {
for(i = 1; i <= num; i++){
// push all numbers to array
arrOfNum.push(i);
}
// multiply each element of array
var result = arrOfNum.reduce(function(a,b){
return a * b;
});
console.log(result);
}
答案 0 :(得分:3)
您已经有一个for
循环,您可以在其中一次计算阶乘,而不使用数组和减少。
function factorial(num) {
var result = 1;
for(i = 2; i <= num; i++) {
result *= i;
}
return result;
}
答案 1 :(得分:1)
综述:
缺少本地变量i
的声明
var i;
其他已使用变量的声明在分布的函数上。更好的方法是在函数顶部声明变量。
Array#reduce
此任务需要initialValue
作为第二个参数。
第一次调用回调时,
previousValue
和currentValue
可以是两个值之一。如果在reduce减号调用中提供initialValue
,则previousValue
将等于initialValue
,currentValue
将等于数组中的第一个值。如果未提供initialValue
,则previousValue
将等于数组中的第一个值,currentValue
将等于第二个值。
function factorial(num) {
var i,
arrOfNum = [],
result;
for (i = 1; i <= num; i++) {
// push all numbers to array
arrOfNum.push(i);
}
// multiply each element of array
result = arrOfNum.reduce(function (a, b) {
return a * b;
}, 1);
document.write(num+'! = '+result + '<br>');
}
factorial(0);
factorial(1);
factorial(2);
factorial(5);
factorial(8);
答案 2 :(得分:1)
您可以使用以下使用递归的方法:
function factorize(num){
if(num === 0){
return 1 ;
}
else {
return num = num * factorize(num-1);
}
}
答案 3 :(得分:0)
只需返回值1
function factorialize(num) {
if (num < 1) return 1; //this line is added
for(i = 1; i <= num; i++){
arrOfNum.push(i);
}
var result = arrOfNum.reduce(function(a,b){
return a * b;
});
console.log(result);
}
答案 4 :(得分:0)
如果您给reduce
初始值1
,即使没有明确的检查,一切都会正常工作:
var result = arrOfNum.reduce(function(a,b){
return a * b;
}, 1);
^^^ // PROVIDE EXPLICIT INITIAL VALUE TO REDUCE
答案 5 :(得分:0)
function factorial(n) {
return Array.apply(0, Array(n)).reduce(function(x, y, z) {
return x + x * z; //1+(1*0), 1+(1*1),2+(2*2), 6+(6*3), 24+(24*4), ...
}, 1);
}
答案 6 :(得分:0)
这是一个相当简化的功能,可以返回所有因素的数组&#39; n&#39;
你只需看看候选人&lt; SQRT(n)的
对于那些不了解|的人0;获取sqrt(n)时的位与Math.floor()
的速度相当因为在一些完整性检查之后定义了factn,函数将返回undefined或一个易于检查的数组,如if(factors = factorize(n){success code} sorta structure
可以对此进行改进但是它们很复杂并且在我编写它时超出了要求 - 特别是我使用它来通过在x + y上使用factorize从大图像计算CSS精灵大小图像的尺寸然后创建第三个共享因子数组(它给出了所有可能的方形精灵尺寸的列表)。
function factorize(n) {
n = Number(n);
if(n) {
if(n > 1) {
var sqrtn = Math.sqrt(n) | 0;
var factn = [1, n];
var ipos = 0;
for(i = 2; i <= sqrtn; i++) {
if((n % i) == 0) {
ipos++;
if((n / i) !== i) {
factn.splice(ipos, 0, i, n / i);
} else {
factn.splice(ipos, 0, i);
}
}
}
}
}
return factn;
}
答案 7 :(得分:0)
不知道为什么会有复杂的答案。一个非常简单的答案是:
var i;
function factorialOf(num) {
//Initially set factorial as number
var factorial = num;
//A for loop starting with 1 and running the times equal to num
for (i = 1; i < num; i++) {
//Set factorial to the number itself * i
factorial = factorial * i;
}
//Return factorial
return factorial;
}
console.log(factorialOf(5));