分解函数 JavaScript

Factorize function javascript

本文关键字:JavaScript 函数 分解      更新时间:2023-09-26

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

你已经有一个for循环,在这个循环中,你可以一次计算阶乘,没有数组和reduce。

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

综述:

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

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

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

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

如果您给reduce一个初始值 1 ,即使没有显式检查,一切也会正常工作:

var result = arrOfNum.reduce(function(a,b){
   return a * b;
 }, 1);
  ^^^         // PROVIDE EXPLICIT INITIAL VALUE TO REDUCE
 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);
 }

演示

这是一个相当简化的函数,它返回"n"的所有因子的数组

你只需要看候选人<sqrt(n(>

对于那些不知道 | 0; 当得到 sqrt(n( 时,位是 Math.floor(( 的更快等价物

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

可以对此进行一些改进,但它们很复杂,超出了我编写它时的要求 - 具体来说,我使用它来计算大图像中的 CSS 精灵大小,方法是在图像的 x + y 维度上使用因式分解,然后创建第三个共享因子数组(这为您提供了所有可能的方形精灵大小的列表(。

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

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

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