我是单位测试,我无法计算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来说太大了
答案 0 :(得分:2)
您发布的代码运行正常。问题是您用来测试代码的代码(您在另一个答案的评论中发布):
assertResult(93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000) {
factorial.recursive_factorial(100)
}
问题是整数文字的类型为Int
,而数字93326 ...显然太大而无法放入int中,因此您无法使用整数文字来表示它。
创建大数字BigInt的一种方法是将其写为字符串并将其转换为BigInt
。所以这样可以正常工作:
assertResult(BigInt("93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000")) {
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的原因。下面的链接中讨论了使用哪种数据类型以及何时使用。