关于(负面)因素(用JavaScript)改进我的代码的任何建议?

时间:2016-01-02 13:12:53

标签: javascript recursion refactoring factorial

我在编写一个因子 n!

时遇到了一个基本问题
function factorialize(num) {
  if (num < 0) {
 return undefined;
  } else if (num === 0) {
    return 1;
  }
  else {
    return num * factorialize(num - 1);
  }
}

我正在学习的网站接受了这个解决方案,但他们只测试非负整数,即n≥0,而不是负整数。

我对如何计算负因子( - n)!感到好奇。许多网页都说这是未定义的,但我发现有两个说它可以定义。

我得到的主旨是:

| N!| = |(-n)!|

他们的绝对值是相同的,但负面因子改变了迹象。

示例:

4! =( - 4)! = 24

5! = 120 ( - 5)! = -120

我从两个链接页面收集的公式是:

( - N)! = | n |! *( - 1)^ n

这反映了我的代码。从测试用例来看,我认为我已经把它钉了下来。我只是想问一下是否有更好的编码方式。来自here的人 注意到使用递归是内存效率低的。

function factorialize(num) {
 if (num === 0) {
   return 1;
  } else if (num > 0) {
     return num * factorialize(num - 1);
  } else {
     return Math.pow(-1, num) * Math.abs(num) * factorialize(Math.abs(num) - 1);  
    }
  }

// test cases below
    console.log(factorialize(-1)); // -1
    console.log(factorialize(1)); // 1
    console.log(factorialize(0)); // 1
    console.log(factorialize(-2)); // 2
    console.log(factorialize(2)); // 2
    console.log(factorialize(-3)); // -6
    console.log(factorialize(3)); // 6
    console.log(factorialize(-4)); // 24
    console.log(factorialize(4)); // 24
    console.log(factorialize(-5)); // -120
    console.log(factorialize(5)); // 120

1 个答案:

答案 0 :(得分:1)

您也可以使用迭代执行此操作(通常,可以递归完成的所有操作也可以迭代完成)。也没有必要提高-1到你的号码的力量。如果您刚刚检查它是奇数还是偶数,它会更有效率。

function factorialize(n){
  var absNum = Math.abs(n);
  var i = 1;
  var factorial = 1;
  while(i <= absNum){
    factorial *= i;
    i += 1;
  }
  if(absNum % 2 === 1 && n < 0){
    return -factorial
  }
  return factorial;
}