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

为什么我不能计算scala中100的阶乘?,scala,factorial,Scala,Factorial,我在进行单元测试,无法计算100的阶乘。我读到使用BigInt会有帮助,但我不确定我做错了什么,因为它仍然不起作用 这是我的功能 package Factorial{ class factorial { def recursive_factorial(number:BigInt) : BigInt = { if (number == 0) return 1 number * recursive_factorial (number - 1) } } }

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

这是我的功能

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

如果我用递归的\u factorial100调用函数。。我得到一个错误,这个数字对于int来说太大了。首先,当这个数字太大时,你的函数有导致堆栈溢出的问题。您应该以递归方式编写它:

@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.33262154439415268169923885626674e+157。下面的链接中讨论了使用哪种数据类型以及何时使用


如果我使用您的代码并添加一个合适的main方法,那么它工作得很好,因此可能错误发生在您没有显示的代码中。请发布一段可运行的代码,重现您的问题和您收到的确切错误消息。我添加了这个。{资产结果9332621544394152681699238856266700490715968264381621468599296389521759993229915089444639761561828625369792208223758251185210916864000000000000000000000000{factorial.recursive{u factorial100}