为什么我不能在 Scala 中计算 100 的阶乘?

Why can't I compute the factorial of 100 in scala?

我正在进行单元测试,我无法计算 100 的阶乘。我读到过使用 BigInt 会有所帮助,但我不确定我做错了什么,因为它仍然不起作用。

这是我的功能。

package Factorial{
class factorial
{
  def recursive_factorial(number:BigInt) : BigInt = 
   {
    if (number == 0)
      return 1
    number * recursive_factorial (number - 1)
  }
}
}

如果我用 recursive_factorial(100).. 调用函数..我得到一个错误,这个数字对于 int

来说太大了

首先你的函数存在number过大导致Whosebug的问题。你应该尾递归地写它:

@annotation.tailrec
def recursive_factorial(number: BigInt, result: BigInt = 1): BigInt = {
  if (number == 0)
    result
  else
    recursive_factorial(number -1, result * number)
}

否则,您的代码示例非常适合我,我不知道您的问题是什么。可能,您尝试在某个时候将此函数的结果(BigInt)写入 Int,这会触发错误。

您发布的代码工作正常。问题是您用来测试代码的代码(您在对另一个答案的评论中发布的代码):

assertResult(93326215443944152681699238856266700490715968264‌​38162146859296389521‌​75999932299156089414‌​63976156518286253697‌​92082722375825118521‌​09168640000000000000‌​00000000000) {
    factorial.recursive_factorial(100)
}

问题是整型字面量的类型是Int,而数字93326...显然太大了不能放入一个int中,所以你不能使用整型字面量来表示它。

创建大数 BigInt 的一种方法是将其写成字符串并将其转换为 BigInt。所以这会很好用:

assertResult(BigInt("93326215443944152681699238856266700490715968264‌​38162146859296389521‌​75999932299156089414‌​63976156518286253697‌​92082722375825118521‌​09168640000000000000‌​00000000000")) {
    factorial.recursive_factorial(100)
}

功能还行。唯一的限制是数据类型 BigInt/BigInteger 不支持 BigDecimal 可以完成的任意精度点整数运算。它的工作方式类似于 BigInt 的包装器。这就是为什么不显示大数字而是显示 9.332621544394415268169923885626674E+157 的原因。在下面的 link 中讨论了使用哪种数据类型以及何时使用。

Performace of BigDecimal vs. BigInteger and BigDecimal