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

时间:2016-09-30 21:18:56

标签: scala factorial

我是单位测试,我无法计算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来说太大了

3 个答案:

答案 0 :(得分:2)

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

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)
}

答案 1 :(得分:1)

首先,当数字太大时,您的函数会出现导致堆栈溢出的问题。你应该以递归方式编写它:

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

否则,您的代码示例对我来说非常有效,我不知道您的问题是什么。您可能会尝试将此函数的结果(BigInt)写入某个点Int,从而触发错误。

答案 2 :(得分:0)

该功能很好。唯一的限制是BigInt / BigInteger数据类型不支持BigDecimal可以完成的任意精度点整数运算。它就像BigInt的包装一样。这就是为什么没有显示大数字而是显示9.332621544394415268169923885626674E + 157的原因。下面的链接中讨论了使用哪种数据类型以及何时使用。

Performace of BigDecimal vs. BigInteger and BigDecimal