【问题标题】:javascript factorial with recursion带有递归的javascript阶乘
【发布时间】:2017-04-15 21:51:46
【问题描述】:

我正在尝试这个简单的代码来计算 5 的阶乘。但结果是“未定义”。我知道其他方法,但这有什么问题?

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title> Learning </title>
<head>
<body>
<h2> Welcome<h2>
<p id="demo"></p>
<script>
var fact=5;
function calfact(num)
{
 if(num!=1)
  {
   fact=fact*(num-1);
   num=num-1;
   calfact(num);
  }
 else
  {
   return fact;
  }
}

document.getElementById("demo").innerHTML=calfact(5);
</script>
</body>
</html>         

【问题讨论】:

标签: javascript recursion factorial


【解决方案1】:

如果您想要递归函数的结果,则通过该函数的所有 代码路径必须返回一些内容。在 num!=1 案例中,您的代码没有返回任何内容。它应该返回调用自身的结果,例如(参见*** 行):

var fact=5;
function calfact(num)
{
 if(num!=1)
  {
   fact=fact*(num-1);
   num=num-1;
   return calfact(num); // ***
  }
 else
  {
   return fact;
  }
}

您的函数正在使用全局变量,这不是一个好主意,因为这意味着该函数不是独立的;并且不是真正的阶乘函数,因为您有效地使用了两个输入(fact - 全局和 num,参数)

如果你想要一个真正的阶乘,你不需要一个全局变量,只需从参数本身开始工作:

function factorial(num) {
    if (num < 0) {
        throw new Error("num must not be negative");
    }
    if (num <= 1) {
        // Both 1! and 0! are defined as 1
        return 1;
    }
    return num * factorial(num - 1);
}
console.log(factorial(5)); // 120

当然,更简洁:

function factorial(num) {
    if (num < 0) {
        throw new Error("num must not be negative");
    }
    return num <= 1 ? 1 : num * factorial(num - 1);
}

(关于 0 的更多信息!:https://en.wikipedia.org/wiki/Factorial

【讨论】:

  • “代码路径”是指所有块?谢谢,顺便说一句!它解决了问题。
  • @ShivamMishra:“代码路径”是执行可以通过函数移动的一种方式(如跟随步行路径)。例如,当num1 时,我们会在函数中走一条路径(在原始函数中使用else 块的路径)。当num 不是 1 时,我们在函数中走不同的路径。
  • 知道了。我希望代码遵循我的直觉。另外,感谢您提到不要使用全局变量。
【解决方案2】:
var fact=5;
function calfact(num){
   if(num!=1){
      fact=fact*(num-1);
      num=num-1;
      return calfact(num);//the missing thing
   }else{
      return fact;//why fact? i think it should be 1
   }
 }

顺便说一句,你的方法可能行得通,但风格很糟糕。可以这样做:

function calfact(num){
  if(num!=1){
    return calfact(num-1)*num;
  }else{
    return 1;
 }
}

或简称:

calfact=num=>num==1?1:calfact(num-1)*num;

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2021-03-18
    • 2015-04-19
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多