我是javascript的新手,我很难弄清楚如何让这个阶乘功能发挥作用。现在这是我的代码。
var x = prompt("Enter a number"); {
function fact(x) {
if (x < 0) {
return ("Enter a positive integer");
}
else {
return (x * fact(x-1))
}
}
}
var result = fact(x)
document.write("The factorial of" + x + "is" + result);
感谢您的帮助!
答案 0 :(得分:2)
你的基本案例对于递归因子是错误的。将其更改为
function fact(x) {
if (x <= 1) {
return 1
}
else {
return (x * fact(x-1))
}
}
答案 1 :(得分:1)
你对阶乘的定义是错误的。阶乘的传统递归定义是:
F(x) => x == 1 ? 1 : x * F(x-1)
或者您可以使用迭代定义
F(x) => var i = 1; for (j = 1..x) i = i * j
在javascript中,递归版本为:
function factorial (x) {
if (x == 1) return x;
return x * factorial(x-1);
}
迭代版本将是:
function factorial (x) {
var result = 1;
for (var y = 1; y <= x; y++) {
result = result * y;
}
return result;
}
您可以在上述功能中添加负数检查。但在我看来,这会掩盖函数的目的(即实现阶乘的传统定义)。更好的方法是在阶乘函数之外移动负数if()
检查。 if (x < 0)
检查有其自己的目的,与计算因子分开:输入验证。
答案 2 :(得分:1)
在每个递归函数中,都存在一个停止条件(在你的情况下是它的if(x<=1)
),没有它,该函数将进入无限递归。你没有添加停止条件。以下是正在运行的更新计划:
var x = prompt("Enter a number"); {
function fact(x) {
if (x < 0) {
return ("Enter a positive integer");
}
else if(x <=1){
return 1;
}
else {
return (x * fact(x-1))
}
}
}
var result = fact(x)
document.write("The factorial of " + x + " is " + result);
答案 3 :(得分:0)
除了修复有缺陷的算法之外,我建议将你的提示转移到自己的功能中以分离关注点。
我也喜欢为此使用while
语句以及对输入执行parseInt
的想法:
function fact(x) {
while (x > 1) {
return (x * fact(x-1));
}
return x;
}
function doFact() {
var x = parseInt(prompt("Enter a positive integer"));
if (x < 1) {
doFact();
} else {
var result = fact(x);
alert("The factorial of " + x + " is " + result);
}
}
doFact();