确定数字的阶乘

时间:2015-03-30 03:56:56

标签: javascript

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

感谢您的帮助!

4 个答案:

答案 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();