关于改进我的(负)阶乘代码(在 JavaScript 中)的任何建议?
Any Suggestions for Improving my Code on (Negative) Factorial (in JavaScript)?
我在做一个关于阶乘编码的基本问题 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 提高到您的数字的幂。如果你只是检查它是奇数还是偶数,它会更有效率。
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;
}
我在做一个关于阶乘编码的基本问题 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 提高到您的数字的幂。如果你只是检查它是奇数还是偶数,它会更有效率。
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;
}