javascript 带递归的阶乘

标签 javascript recursion factorial

我正在尝试这个简单的代码来计算 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>         

最佳答案

如果您想要递归函数的结果,则通过该函数的所有代码路径都必须返回某些内容。您的代码在 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 )

关于javascript 带递归的阶乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43426769/

相关文章:

javascript - 如何设置 Vue 路由或覆盖后退按钮以像应用程序一样运行

javascript - Youtube 缓冲完成事件是否可能

javascript - SharePoint JSOM 获取分类递归

recursion - 简单的 LISP 代码不会捕获输入错误

javascript - 倒计时重定向按钮

javascript - chrome.runtime.onMessage 在后台脚本中未定义(chrome 扩展)

java - 将单词逐个字符递归地添加到 LinkedHashMap

c++ - 在 C++ 中对象移动后如何更新四叉树?

java - 阶乘 java 返回 0

memory - 使用整数变量在 FORTRAN 上计算阶乘。内存溢出