分解函数javascript

时间:2016-03-25 12:08:41

标签: javascript factorial

我在写一个能够分解数字的函数时遇到了一些问题。困难的部分已经完成。但是,当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);
}

8 个答案:

答案 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作为第二个参数。

      

    第一次调用回调时,previousValuecurrentValue可以是两个值之一。如果在reduce减号调用中提供initialValue,则previousValue将等于initialValuecurrentValue将等于数组中的第一个值。如果未提供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);
 }

DEMO

答案 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));