【问题标题】:Factorize function javascript因式分解函数 javascript
【发布时间】:2016-03-25 12:08:40
【问题描述】:

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

【问题讨论】:

标签: javascript factorial


【解决方案1】:

您已经有一个for 循环,您可以在其中一次计算阶乘,无需数组和归约。

function factorial(num) {
  var result = 1;
  for(i = 2; i <= num; i++) {
      result *= i;
  }
  return result;
}

【讨论】:

    【解决方案2】:

    综述:

    • 缺少局部变量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);

    【讨论】:

      【解决方案3】:

      您可以使用以下使用递归的方法:

      function factorize(num){
          if(num === 0){
              return 1 ;
          }
          else {
              return num = num * factorize(num-1);
          }
      }
      

      【讨论】:

        【解决方案4】:

        只需返回值 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);
             }
        

        【讨论】:

          【解决方案5】:

          如果你给reduce一个初始值1,即使没有明确的检查,一切都会正常工作:

          var result = arrOfNum.reduce(function(a,b){
             return a * b;
           }, 1);
            ^^^         // PROVIDE EXPLICIT INITIAL VALUE TO REDUCE
          

          【讨论】:

            【解决方案6】:
             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

            【讨论】:

            • 你确定x + x * z
            • @torazaburo 是的,X:previousValue,Y:currentValue,Z:currentIndex 所以它会像:1+(1*0), 1+(1*1),2+(2* 2)、6+(6*3)、24+(24*4)等
            【解决方案7】:

            这是一个相当精简的函数,它返回一个包含 'n' 的所有因子的数组

            你只需要看候选人

            对于那些不知道 | 0;获取 sqrt(n) 时的 bit 相当于 Math.floor()

            由于 factn 是在一些健全性检查后定义的,因此函数将返回 undefined 或一个易于检查的数组,例如 if(factors = factorize(n) { success code } sorta structure

            可以对此进行改进,但它们很复杂并且超出了我编写它时的要求 - 具体来说,我使用它通过在 x + y 维度上使用分解来计算大图像的 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;
            }
            

            【讨论】:

              【解决方案8】:

              不知道为什么会有复杂的答案。一个非常简单的答案是:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-01-28
                • 2011-02-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多