2016-01-02 19 views
1

我在编码阶乘n时正在做一个基本的问题!有关改进我的代码(JavaScript)中(负)因数的任何建议?

function factorialize(num) { 
    if (num < 0) { 
return undefined; 
    } else if (num === 0) { 
    return 1; 
    } 
    else { 
    return num * factorialize(num - 1); 
    } 
} 

网站我是从接受了这个解决方案的学习,但他们只是在测试的非负整数,即对ň≥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 
+0

我觉得你的问题是更切合主题,以[CR](http://codereview.stackexchange.com/)比SO – hindmost

+0

@天诛地灭,感谢小费 – elp1987

+0

如果您决定到那里张贴,注意你的问题可以使用一些工作。在你明确表达你想要做的事情之前,我必须阅读你的问题3次。 – Mast

回答

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

除了缺少分号,这是一个好主意,队友! – elp1987

相关问题